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脚本,删除不必要的注释和空行 将语句按分 ...
随机推荐
- ubuntu14.4 分辨率偏低
最近出了 14.04 LTS,就想安装上玩一玩.还是用 easybcd 从 windows硬盘安装.装完之后,显示效果不好于是做了如下处理: 1. 按下windows键,搜索 "附加驱动&q ...
- 报错django.db.migrations.exceptions.InconsistentMigrationHistory
Pycharm强大的功能总是让我很是着迷,比如它的makemigrations 和 migrate. 然而某一次,当我再次敲下这熟悉的命令时,它报错了.... Traceback (most rece ...
- 【Android学习笔记】布局的简单介绍
我在学习Android开发的时候是基于实战项目的,基础理论知识以前也是零散的看过一些,个人还是觉得边做项目边学要快些.现在做的这个项目iOS端是我做的,这样逻辑什么的都很熟悉,于我而言换个平台也只是换 ...
- [SCOI2010]生成字符串
题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...
- [SDOI2008]Sandy的卡片
题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...
- ●BZOJ 2434: [Noi2011]阿狸的打字机
●赘述题目 (题意就不赘述了) ●解法: ●我先想的一个比较暴力的方法(要TLE): (ac自动机)先求出last数组(参见刘汝佳的解释:last[j]:表示j节点沿着失配指针往回走时,遇到的下一个单 ...
- hdu 5437Alisha’s Party(优先队列)
题意:邀请k个朋友,每个朋友带有礼物价值不一,m次开门,每次开门让一定人数p(如果门外人数少于p,全都进去)进来,当所有人到时会再开一次,每次都是礼物价值高的人先进. /*小伙伴最开始gg了,结果发现 ...
- HDU 5506(GT and set)
题意: 表示看了很久,然而发现还是没看懂题. 正解:给你a个集合,让你把他们合并成k个,当两个集合有公共数字时可以合并. (一直以为是合并后,每个集合至少有两个数字相同- -,这英语也是醉了) 思路: ...
- python变量、条件循环语句
1. 变量名 - 字母 - 数字 - 下划线 #数字不能开头:不能是关键字:最好不好和python内置的函数等重复 2. 条件语句 缩进用4个空格(Tab键)注意缩进如果是空格键和Tab键混用, ...
- JSONObject转换分析
net.sf.json.JSONObject采用反射的方式,对POJO进行转换.JSONObject类实现了JSON.Map和Comparable接口,如下: class JSONObject ext ...