UE4读取本地XML文件

本文介绍如何在UE4中集成TinyXML库进行XML文件的读写操作,包括添加TinyXML到UE4项目的步骤及使用TinyXML API进行XML解析与生成的具体实现。

其实这里读取XML也是利用了Tinyxml来读取xml,主要是讲Tinyxml放在UE4中,遇到的一点点坑

1.先给出Tinyxml链接:http://www.grinninglizard.com/tinyxml/,可以下载他的工程

2.用UE4新建一个C++工程,将下图的几个文件添加到UE4.的工程中


3.并在tinyxml的cpp文件中添加本工程的头文件,比如这里是

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "MatineeProject.h"  
4.在UE4中的任意C++文件中,tinyxml的头文件

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "tinyxml.h"  
  2. #include "tinystr.h"  
5.尝试利用tinyxml的接口读取本地xml,主要注意一些变量类型的转换,UE4是自己的一套变量类型,并不适用tinyxml

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <string>
    #include <iostream>
    #include <tinyxml.h>


    void printSchoolXml();
    void readSchoolXml();
    void writeSchoolXml();
    int main(int argc, char** argv) {
    printSchoolXml();
    readSchoolXml();
    writeSchoolXml();
    return 0;
    }


    void printSchoolXml() {
    using namespace std;
    TiXmlDocument doc;  
    const char * xmlFile = "conf/school.xml";
    if (doc.LoadFile(xmlFile)) {  
    doc.Print();  
    } else {
    cout << "can not parse xml conf/school.xml" << endl;
    }
    }


    void readSchoolXml() {
    using namespace std;
    const char * xmlFile = "conf/school.xml";
    TiXmlDocument doc;  
    if (doc.LoadFile(xmlFile)) {  
    doc.Print();  
    } else {
    cout << "can not parse xml conf/school.xml" << endl;
    return;
    }
    TiXmlElement* rootElement = doc.RootElement();  //School元素  
    TiXmlElement* classElement = rootElement->FirstChildElement();  // Class元素
    TiXmlElement* studentElement = classElement->FirstChildElement();  //Students  
    for (; studentElement != NULL; studentElement = studentElement->NextSiblingElement() ) {  
    TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute();  //获得student的name属性  
    for (;attributeOfStudent != NULL; attributeOfStudent = attributeOfStudent->Next() ) {  
    cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;  
    }


    TiXmlElement* studentContactElement = studentElement->FirstChildElement();//获得student的第一个联系方式 
    for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) {
    string contactType = studentContactElement->Value();
    string contactValue = studentContactElement->GetText();
    cout << contactType  << " : " << contactValue << std::endl;  
    }


    }  
    }




    void writeSchoolXml() {
    using namespace std;
    const char * xmlFile = "conf/school-write.xml";
    TiXmlDocument doc;  
    TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");  
    TiXmlElement * schoolElement = new TiXmlElement( "School" );  
    TiXmlElement * classElement = new TiXmlElement( "Class" );  
    classElement->SetAttribute("name", "C++");


    TiXmlElement * stu1Element = new TiXmlElement("Student");
    stu1Element->SetAttribute("name", "tinyxml");
    stu1Element->SetAttribute("number", "123");
    TiXmlElement * stu1EmailElement = new TiXmlElement("email");
    stu1EmailElement->LinkEndChild(new TiXmlText("tinyxml@163.com") );
    TiXmlElement * stu1AddressElement = new TiXmlElement("address");
    stu1AddressElement->LinkEndChild(new TiXmlText("中国"));
    stu1Element->LinkEndChild(stu1EmailElement);
    stu1Element->LinkEndChild(stu1AddressElement);


    TiXmlElement * stu2Element = new TiXmlElement("Student");
    stu2Element->SetAttribute("name", "jsoncpp");
    stu2Element->SetAttribute("number", "456");
    TiXmlElement * stu2EmailElement = new TiXmlElement("email");
    stu2EmailElement->LinkEndChild(new TiXmlText("jsoncpp@163.com"));
    TiXmlElement * stu2AddressElement = new TiXmlElement("address");
    stu2AddressElement->LinkEndChild(new TiXmlText("美国"));
    stu2Element->LinkEndChild(stu2EmailElement);
    stu2Element->LinkEndChild(stu2AddressElement);


    classElement->LinkEndChild(stu1Element);  
    classElement->LinkEndChild(stu2Element);  
    schoolElement->LinkEndChild(classElement);  

    doc.LinkEndChild(decl);  
    doc.LinkEndChild(schoolElement); 
    doc.SaveFile(xmlFile);  
    }
<think>好的,我现在需要帮助用户在Unreal Engine蓝图中实现XML文件读取和解析。根据用户提供的引用资料,我需要先整理已有的信息,然后一步步指导用户操作。 首先,用户提到的引用[4]指出,UE4提供了平台无关的文件读写接口,支持XML文件的处理。这说明UE本身有内置的功能,不需要额外插件。不过引用[3]和[5]提到使用XmlParser库和FXmlFile类,这可能是引擎内置的模块。用户可能需要在项目中启用XmlParser模块,这一步可能需要修改项目的.Build.cs文件,添加“XmlParser”到PublicDependencyModuleNames中。我需要确认这一点是否正确。 接下来,用户需要在蓝图中添加一个ReadXML功能块到BP_PlayerController,并绑定按键O来触发读取并打印IP。根据引用[5]的C++示例,可能需要创建一个蓝图函数库或者使用现有的节点来读取XML。但用户想用蓝图实现,可能需要使用蓝图函数或调用引擎节点。但根据引用[3],用户使用了Unreal的XmlParser库,并通过蓝图Structure定义结构体。这可能涉及到将解析后的数据填充到结构体中,方便蓝图使用。 步骤可能包括:1. 准备XML文件,放置在Content目录下,比如Content/Data/config.xml。2. 在蓝图中使用“Load File to String”节点加载XML文件内容。3. 解析XML内容,这里可能需要调用FXmlFile的相关函数。但蓝图中是否有现成的节点呢?如果没有,可能需要通过C++创建一个蓝图可调用的函数,如引用[5]中的ReadXmlFile,然后在蓝图中调用它。不过用户希望完全在蓝图中完成,可能需要检查是否有插件或内置节点可用。 引用[2]提到有一个市场插件可以处理XML读写,如果用户不想写代码,可能需要推荐该插件。但用户的问题是关于使用蓝图,所以需要说明两种方法:使用内置功能(可能需要C++辅助)或者使用插件。 综上,步骤应该是:首先确保XmlParser模块已启用,然后通过蓝图加载文件内容,接着解析XML。但蓝图中可能没有直接解析XML的节点,所以需要创建自定义函数或在C++中处理,再暴露给蓝图。或者使用插件简化流程。需要分情况说明,并引用相关的引用资料作为支持。</think>### 分步实现UE蓝图解析XML文件 #### 步骤1:准备XML文件XML文件(如`config.xml`)放置在项目`Content/Data`目录下,格式示例: ```xml <ServerConfig> <IP>192.168.1.100</IP> <Port>8080</Port> </ServerConfig> ``` #### 步骤2:启用XmlParser模块(关键配置) 1. 打开项目根目录的`YourProjectName.Build.cs`文件 2. 添加模块依赖项: ```csharp PublicDependencyModuleNames.AddRange(new string[] { "Core", "XmlParser" // 添加引擎内置XML解析模块 }); ``` #### 步骤3:创建蓝图可调用函数(C++层) 创建继承自`BlueprintFunctionLibrary`的C++类(如`XmlHelper`),暴露解析方法: ```cpp // XmlHelper.h UFUNCTION(BlueprintCallable, Category="XML") static FString GetXmlValue(const FString& FilePath, const FString& Tag); ``` ```cpp // XmlHelper.cpp FString UXmlHelper::GetXmlValue(const FString& Path, const FString& Tag) { TSharedPtr<FXmlFile> XmlFile = MakeShareable(new FXmlFile(Path)); if(!XmlFile->IsValid()) return ""; FXmlNode* Root = XmlFile->GetRootNode(); for(FXmlNode* Node : Root->GetChildrenNodes()) { if(Node->GetTag() == Tag) return Node->GetContent(); } return ""; } ``` #### 步骤4蓝图实现流程 1. **创建键盘事件绑定** - 在`BP_PlayerController`的事件图表中: ```python O键被按下时 -> 执行XML读取逻辑 ``` 2. **加载并解析XML** ![蓝图节点示意图](https://via.placeholder.com/600x200?text=Load+File+to+String+->+GetXmlValue+节点) 3. **打印结果** ```python Print String节点:显示"服务器IP: "+解析结果 ``` #### 两种实现方案对比 | 方案 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | 内置XmlParser | 无需额外插件 | 需要C++代码支持 | 需要深度定制解析逻辑 | | 市场插件[^2] | 纯蓝图实现 | 需付费购买 | 快速实现基础功能 | #### 高级技巧 1. **结构体映射**:将XML数据映射到蓝图结构体,实现类型安全访问[^3] 2. **错误处理**:添加`isValid`检查,防止空节点崩溃 3. **异步加载**:使用AsyncTask避免主线程卡顿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值