UE4使用第三方库读写xml文件
原文链接:http://gad.qq.com/article/detail/7181031
本文首发腾讯GAD开发者平台,未经允许,不得转载
在游戏开发过程中,读写xml几乎已经成为不可或缺的功能,但是由于有一点点的先入为主,当时直接选择了使用c++常用的tinyxml,于是这里就需要引用第三库,其实UE4有一个自带的XmlParser,也可以轻松读写xml。下面我们就看看这两种的方式的详细操作。
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文件,打开就会看见写入了我们之前所输入的内容。
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);
}
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文件的更多相关文章
- PHP读写XML文件的四种方法
PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...
- cocos2d-x 读写 xml 文件
cocos2d-x 读写 xml 文件 A product of cheungmine使用cocos2d-x开发2d游戏确实方便,但是对于一般的小游戏,经常需要的工作是UI布局设计和调整,代码改来改去 ...
- C# 使用 NPOI 库读写 Excel 文件
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples,给出 ...
- C#读写xml文件的常用方法
已知有一个XML文件(bookshop.xml)如下: <?xml version="1.0" encoding="gb2312" ?> <b ...
- Java 读写XML文件 API--org.dom4j
om4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件 ...
- Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- java通过dom读写xml文件
java通过dom读写xml文件 要读的xml文件 <?xml version="1.0" encoding="GB2312"?><学生花名册 ...
- 一点一点学写Makefile(3)-增加第三方库和头文件
我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...
- 使用java以及jdbc不使用第三方库执行sql文件脚本
使用java以及jdbc不使用第三方库执行sql文件脚本 2017年02月15日 15:51:45 阅读数:660 使用java执行sql脚本的方法 解析sql脚本,删除不必要的注释和空行 将语句按分 ...
随机推荐
- [LeetCode] Basic Calculator III 基本计算器之三
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- Jmeter启动问题总结
下载下来的jmeter文件,双击jmeter.bat文件打开的时候,系统提示如下: 查询安装的环境,java的jdk存在,并且版本在1.7以上,详情如下: 在环境变量PATH中添加:%SystemRo ...
- jQuery中的事件监听小记
一,一个事件监听的简便写法 最近发现一个jQuery中事件监听的简洁写法,感觉方便好多.同时也深感自己基础薄弱,好多东西竟然都模棱两可.因此,记录的同时,也对jQuery事件监听做个小的总结 原文链接 ...
- Docker(六):Docker 三剑客之 Docker Swarm
实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ...
- javascript的基础(1)
1.javascript是什么? 它是一门基于客户端的脚本语言,是相对于服务器而言,浏览器就是一个客户端软件,浏览器从服务器上将资源(html,css,js,图片等)请求下来 并且在本地利用浏览器去解 ...
- Java爬虫原理分析
当我们需要从网络上获取资源的时候,我们一般的做法就是通过浏览器打开某个网站,然后将我们需要的东西下载或者保存下来. 但是,当我们需要大量下载的时候,这个时候通过人工一个个的去点击下载,就显得太没有效率 ...
- [NOIp 2012]国王游戏
Description 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国 ...
- poj 1704 Georgia and Bob(阶梯博弈)
Georgia and Bob Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9363 Accepted: 3055 D ...
- [cf453e]Little Pony and Lord Tirek
来自FallDream的博客,未经允许,请勿转载,谢谢. 更博客= = 有n个数,每个数字都有一个初始大小ai和最大值mi,然后每秒会增加ri,你需要回答m个发生时间依此增大的询问,每次询问区间和并且 ...
- 面试(二)---synchronized
一.前言 本来计划将ConcurrentHashMap和HashMap对比着来说下,奈何看的源码有点懵逼,我在思考思考,等等有个清晰的思路在搞起来,我们先来谈一下synchronized ...