原文链接:http://gad.qq.com/article/detail/7181031

本文首发腾讯GAD开发者平台,未经允许,不得转载

在游戏开发过程中,读写xml几乎已经成为不可或缺的功能,但是由于有一点点的先入为主,当时直接选择了使用c++常用的tinyxml,于是这里就需要引用第三库,其实UE4有一个自带的XmlParser,也可以轻松读写xml。下面我们就看看这两种的方式的详细操作。

一、准备工作:
1.用UE4创建一个空模板的C++工程,命名为TinyxmlProject。
2.https://sourceforge.net/projects/tinyxml/在这里下载tinyxml的工程。

二、XmlParser:
1.为Build脚本添加XmlParser的模块,用vs打开当前的工程,找到并打开Source/TinyxmlProject/TinyxmlProject.Build.cs脚本,在PublicDependencyModuleNames中添加"XmlParser":
public TinyxmlProject(TargetInfo Target)
{
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" , "XmlParser" }); PrivateDependencyModuleNames.AddRange(new string[] { }); // Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); // Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// if ((Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Win64))
// {
// if (UEBuildConfiguration.bCompileSteamOSS == true)
// {
// DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");
// }
// }
}

2.在TinyxmlProjectGameMode添加头文件XmlParser.h就开始写第一个功能,创建并写入xml文件,因为之前的Build.cs中添加了模块,我们可以直接在脚本中添加头文件,这里的xml内容注意符合xml的规则,如果不符合就无法写入。

void ATinyxmlProjectGameMode::CreateXmlParser()
{
//xml的内容
const FString _XmlContent = "<DocumentElement>\n<Infor>\n< ID>01 </ID >\n<Name>AB</Name>\n<Content>BCD</Content>\n</Infor>\n</DocumentElement>";
//以Buffer的方式构建一个XmlFile对象
FXmlFile* _WriteXml = new FXmlFile(_XmlContent, EConstructMethod::ConstructFromBuffer);
//保存xml文件 FPaths::GameDir()表示当前工程的路径
_WriteXml->Save(FPaths::GameDir() + "test.xml"); GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, "create success!");
}

3.然后在BeginPlay中调用CreateXmlParser(),并在ue4中编译运行,就会在工程路径下找到一个test.xml文件,打开就会看见写入了我们之前所输入的内容。

4.读取xml,具体注释在脚本中:
void ATinyxmlProjectGameMode::ReadXmlParser(const FString &_XmlPath)
{
//创建一个XmlFile的对象
FXmlFile* _XmlFile = new FXmlFile(*_XmlPath);
//获取XmlFile的根节点
FXmlNode* _RootNode = _XmlFile->GetRootNode();
//获取根节点下的所有子节点
const TArray assetNodes = _RootNode->GetChildrenNodes();
for (int i = 0; i < assetNodes.Num(); i++)
{
const TArray contentNodes = assetNodes[i]->GetChildrenNodes(); for (int i = 0; i < contentNodes.Num(); i++)
{
//获取并打印出节点内容
FString _TContent = contentNodes[i]->GetContent();
GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Blue, _TContent);
}
}
}

5.继续调用编译并打印,在屏幕上就能看见我们所获取的节点内容

void ATinyxmlProjectGameMode::BeginPlay()
{
//xml的路径
const FString _xmlpath = FPaths::GameDir() + "test.xml";
ReadXmlParser(_xmlpath);
}

三、tinyxml:
1.先给一个第三方库的官方wiki,详细的步骤也可以参照这个来看:https://wiki.unrealengine.com/Linking_Static_Libraries_Using_The_Build_System
2.打开开始下载的tinyxml工程,右键打开属性,因为我这里会使用的64位的平台,需要将tinyxml的平台改为x64。
3.生成tinyxml工程,并找到生成的tinyxml.lib文件和tinystr.h、tinyxml.h两个头文件,分别复制到ue4工程目录下的TinyxmlProject\ThirdParty\Libs和TinyxmlProject\ThirdParty\Includes,这里的工程下的文件夹都是新建的。
4.在ue4中找到我们最开始更改的TinyxmlProject.Build.cs脚步,我们又需要添加新的配置,这里我就直接给出整个脚本,这里的功能就是替代普通c++工程引用静态库的配置,详细看看都一个意思,只是方式不同而已。
using System.IO;
using UnrealBuildTool; public class TinyxmlProject : ModuleRules
{
private string ModulePath
{
get { return ModuleDirectory; }
}
//第三方库的路径
private string ThirdPartyPath
{
get { return Path.GetFullPath(Path.Combine(ModulePath, "../../ThirdParty/")); }
} public TinyxmlProject(TargetInfo Target)
{
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" , "XmlParser" }); PrivateDependencyModuleNames.AddRange(new string[] { }); //头文件目录
PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "Includes"));
//lib文件
PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "Libs","tinyxml.lib")); // Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); // Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// if ((Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Win64))
// {
// if (UEBuildConfiguration.bCompileSteamOSS == true)
// {
// DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");
// }
// }
}
}

5.静态库配置完成后,再脚本中添加tinystr.h、tinyxml.h两个头文件,我们就尝试利用tinyxml的接口读取本地xml,这里主要注意一些变量类型的转换,UE4是自己的一套变量类型,并不适用tinyxml。

bool ATinyxmlProjectGameMode::ReadXmlFile(const FString &_XmlPath)
{
//将TCHAR转换char 并转UTF-8编码
int32 iLength = WideCharToMultiByte(CP_UTF8, 0, *_XmlPath, -1, NULL, 0, NULL, NULL);
char* path = new char[iLength + 1];
WideCharToMultiByte(CP_UTF8, 0, *_XmlPath, -1, path, iLength, NULL, NULL); //创建一个XML的文档对象。
TiXmlDocument *myDocument = new TiXmlDocument();
if (myDocument->LoadFile(path))
{
//获得根元素
TiXmlElement *RootElement = myDocument->RootElement(); //将char转为TCHAR utf-8编码 支持中文
const char* outchar = RootElement->Value();
iLength = MultiByteToWideChar(CP_UTF8, 0, outchar, strlen(outchar) + 1, NULL, 0);
TCHAR* outTchar = new TCHAR[iLength + 1];
MultiByteToWideChar(CP_UTF8, 0, outchar, strlen(outchar) + 1, outTchar, iLength); GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Green, outTchar);
return true;
}
return false;
}

6.再次编译调试

void ATinyxmlProjectGameMode::BeginPlay()
{
//xml的路径
const FString _xmlpath = FPaths::GameDir() + "test.xml";
if(!ReadXmlFile(_xmlpath))
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, "read failed");
}


7.这里的操作差不多就测试完了,其他的tinyxml的操作,百度Google一下就知道了。

UE4使用第三方库读写xml文件的更多相关文章

  1. PHP读写XML文件的四种方法

    PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...

  2. cocos2d-x 读写 xml 文件

    cocos2d-x 读写 xml 文件 A product of cheungmine使用cocos2d-x开发2d游戏确实方便,但是对于一般的小游戏,经常需要的工作是UI布局设计和调整,代码改来改去 ...

  3. C# 使用 NPOI 库读写 Excel 文件

    NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples,给出 ...

  4. C#读写xml文件的常用方法

    已知有一个XML文件(bookshop.xml)如下: <?xml version="1.0" encoding="gb2312" ?> <b ...

  5. Java 读写XML文件 API--org.dom4j

    om4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件 ...

  6. Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  7. java通过dom读写xml文件

    java通过dom读写xml文件 要读的xml文件 <?xml version="1.0" encoding="GB2312"?><学生花名册 ...

  8. 一点一点学写Makefile(3)-增加第三方库和头文件

    我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...

  9. 使用java以及jdbc不使用第三方库执行sql文件脚本

    使用java以及jdbc不使用第三方库执行sql文件脚本 2017年02月15日 15:51:45 阅读数:660 使用java执行sql脚本的方法 解析sql脚本,删除不必要的注释和空行 将语句按分 ...

随机推荐

  1. 设置python爬虫IP代理(urllib/requests模块)

    urllib模块设置代理 如果我们频繁用一个IP去爬取同一个网站的内容,很可能会被网站封杀IP.其中一种比较常见的方式就是设置代理IP from urllib import request proxy ...

  2. [LeetCode] Count Different Palindromic Subsequences 计数不同的回文子序列的个数

    Given a string S, find the number of different non-empty palindromic subsequences in S, and return t ...

  3. codevs 2621 土地侵蚀

    提交地址:http://codevs.cn/problem/2621/ 2621 土地侵蚀  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold     题目描述 De ...

  4. [BZOJ 3329]Xorequ

    Description 题库链接 给出 \(n\) ,分别求 \(\leq n\) 和 \(\leq 2^n\) 的满足方程 \[x\oplus 3x=2x\] 的正整数解个数. \(1\leq n\ ...

  5. ●洛谷P1291 [SHOI2002]百事世界杯之旅

    题链: https://www.luogu.org/recordnew/show/5861351题解: dp,期望 定义dp[i]表示还剩下i个盖子没收集时,期望还需要多少次才能手机完. 初始值:dp ...

  6. hdu 5392

    Sample Input 2 3 1 3 2 6 2 3 4 5 6 1   Sample Output 2 6 题意:给一个转置求它的循环长度 题解:分解成循环求最小公倍数 #include< ...

  7. bzoj 4025: 二分图

    Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. 解题报告: ...

  8. bzoj1071[SCOI2007]组队

    1071: [SCOI2007]组队 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2472  Solved: 792[Submit][Status][ ...

  9. LCD接口和RGB介绍

    1. 介绍 Video的显示离不开LCD, 所以这里简单介绍一下LCD的接口和RGB LCD的全称是Liquid Crystal Display 的简称, 即液晶显示器LCD目前已经取代CRT, 成为 ...

  10. Linux 脚本为什么会有#!

    我们在Linux系统终端编辑脚本时第一行通常这么写: #!/usr/bin/env python3 为什么要写这一行,起什么作用? 我们先看看不写这一行会出现什么?那么就会报下面的错误. #!/usr ...