UE4-XML文件读写

UE4自带一个XmlParser,可以很方便的实现Xml的简单读写功能。

  • 在PublicDependencyModuleNames.AddRange中添加XmlParser。
  • 在文件中添加#include “XmlParser\Public\XmlParser.h"

其主要功能包括节点值读取和节点属性读取,仅提供了设置节点值和添加节点的功能,没有提供属性设置功能,不能创建跟节点。

1)主要功能

class XMLPARSER_API FXmlFile
public:
    FXmlFile() : RootNode(nullptr), bFileLoaded(false) {}
    FXmlFile(const FString& InFile, EConstructMethod::Type ConstructMethod = EConstructMethod::ConstructFromFile);
    ~FXmlFile() { Clear(); };
private:
    FXmlFile(const FXmlFile& rhs) {}
    FXmlFile& operator=(const FXmlFile& rhs) { return *this; };
public:
    //加载文件
    bool LoadFile(const FString& Path, EConstructMethod::Type ConstructMethod = EConstructMethod::ConstructFromFile);
    FString GetLastError() const;//获取最后一条错误消息
    void Clear();//清除所有内部文件。注意:使指向FXmlNode的任何现有指针无效 
    /** Checks to see if a file is loaded */
    bool IsValid() const;//判断文件是否加载成功
    const FXmlNode* GetRootNode() const;//返回跟节点
    FXmlNode* GetRootNode();//返回跟节点
    bool Save(const FString& Path);//写入磁盘,目前仅支持UTF-16格式
private:
private:
    FString LoadedFile;//文件路径
    FString ErrorMessage;//返回给客户端的错误消息
    FXmlNode* RootNode;//跟节点指针
    bool bFileLoaded;//文件是否被加载
    bool bCreationFailed;//节点创建过程是否失败
};

xmlnode的主要功能

class XMLPARSER_API FXmlAttribute
public:
    FXmlAttribute(const FString& InTag, const FString& InValue)
        : Tag(InTag)
        , Value(InValue)
    const FString& GetTag() const;//读取属性名称
    const FString& GetValue() const;//读取属性值
private:
    FString Tag;//属性名称
    FString Value;//属性值
class XMLPARSER_API FXmlNode
    friend class FXmlFile;
private:
    FXmlNode() : NextNode(nullptr) {}
    FXmlNode(const FXmlNode& rhs) {}
    ~FXmlNode() { Delete(); }
    void Delete();
public:
    const FXmlNode* GetNextNode() const;//获得下一个节点
    const TArray<FXmlNode*>& GetChildrenNodes() const;//获得所有子节点
    const FXmlNode* GetFirstChildNode() const;//获得第一个子节点
    const FXmlNode* FindChildNode(const FString& InTag) const;//根据节点名称查找子节点
    FXmlNode* FindChildNode(const FString& InTag);//
    const FString& GetTag() const;//获得节点名称
    const FString& GetContent() const;//获得节点值
    const TArray<FXmlAttribute>& GetAttributes() const;//获得节点属性列表
    FString GetAttribute(const FString& InTag) const;//获得节点某个属性
    void SetContent(const FString& InContent);//接入节点值
    void AppendChildNode(const FString& InTag, const FString& InContent);//添加子节点
private:
    TArray<FXmlNode*> Children;//子节点列表
    TArray<FXmlAttribute> Attributes;//节点属性列表
    FString Tag;//节点名称
    FString Content;//节点内容
    FXmlNode* NextNode;//下一个节点指针
};

2)示例

- XML文件

<?xml version="1.0" ?>
<list id="0">
    <item id="1" property="静态文本框1" text="HelloWorld_1" variable="string" type="STextBlock"/>
    <item id="2" property="TestString_2" text="HelloWorld_2" variable="string" type="STextBlock"/>	
</list>

-文件读写

//读取文件

	FString filePath = TEXT("C:\\git\\list.fig.xml");
	FXmlFile xml(filePath);
	if (!xml.IsValid())
		return;
	//获取顶级节点
	FXmlNode * topNode = xml.GetRootNode();
	//获取所有子节点
	const TArray<FXmlNode*>& children = topNode->GetChildrenNodes();
	//获取第一个子节点的属性
	FString value = topNode->GetFirstChildNode()->GetAttribute(TEXT("property"));
	//写入值
	topNode->AppendChildNode(TEXT("testNode"),TEXT("haha"));
	xml.Save(TEXT("C:\\git\\testSave.xml"));

通过TinyXML实现复杂的XML读写功能

github下载tinyxml2相关文件,包括tinyxml2.h和tinyxml2.cpp

头文件中引入#include "tinyxml2.h" 及 using namespace tinyxml2;

UE4在Windows下FString默认为TChar,在使用tinyxml时,通过TCHAR_TO_UTF8实现FString到std::string的转换,通过UTF8_TO_TCHAR实现std::string到FString的转换,同时保存文件时,应确保文件采用UTF8文件格式。

- XML写入文件

XMLDocument  * doc = new XMLDocument;
XMLDeclaration *declaration = doc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\"");
doc->LinkEndChild(declaration);
XMLElement *School = doc->NewElement(TCHAR_TO_UTF8(TEXT("学校")));
doc->LinkEndChild(School);
School->SetAttribute(TCHAR_TO_UTF8(TEXT("名称")), TCHAR_TO_UTF8(TEXT("机械工程学院")));
 XMLElement *Student = doc->NewElement(TCHAR_TO_UTF8(TEXT("学生")));
 School->LinkEndChild(Student);
 Student->SetAttribute(TCHAR_TO_UTF8(TEXT("姓名")), TCHAR_TO_UTF8(TEXT("天霸")));
 Student->SetAttribute(TCHAR_TO_UTF8(TEXT("学号")), TCHAR_TO_UTF8(TEXT("01")));
if (XML_SUCCESS != doc->SaveFile(TCHAR_TO_UTF8(TEXT("C:\\git\\testSave.xml")))) {
		delete doc;
	delete doc;
-TinyXML读取文件
FString filePath = TEXT("C:\\git\\testSave.xml");
XMLDocument doc;
if (XML_SUCCESS != doc.LoadFile(TCHAR_TO_UTF8(*filePath))) {
    return;
XMLElement * school = doc.RootElement();
if (school) {
    XMLElement *node = school->FirstChildElement(TCHAR_TO_UTF8(TEXT("学生")));