Unity 之 Lua中读取处理XML文件

举报
陈言必行 发表于 2021/08/13 23:29:48 2021/08/13
【摘要】 Unity 之 Lua中处理XML文件 一.下载xmlSimple.lua并导入工程二.解析XML三.实际使用 一.下载xmlSimple.lua并导入工程 首先需要下载Lua-Simple-XML:GitHub地址: https://github.com/Cluain/Lua-Simple-XML-Parser 1.将xmlSimple.lua文件复...

一.下载xmlSimple.lua并导入工程

首先需要下载Lua-Simple-XML:GitHub地址:
https://github.com/Cluain/Lua-Simple-XML-Parser

1.将xmlSimple.lua文件复制到项目中。
2.创建局部变量local xml = require(“xmlSimple.lua”).newParser()
3.使用xml:ParseXmlText(xmlString)或xml:loadFile(xmlFilename, base)

按照上面的步骤使用,我将xmlSimple.lua脚本导入到:LuaFramework --> Lua – > Common 的文件夹下面,所有我创建局部变量是下图这样写的:
fuzhi
读取代码:
xml:ParseXmlText(xmlString) 这个读取方式是传递一个Xml的字符串,就不多说了,官方的Demo就是这么写的,有兴趣可以去看下.

xml:loadFile(xmlFilename, base) 这个读取文件的形式的不太好用,可能是我没用明白吧,有知道的大佬,希望留言解惑.


二.解析XML

是Lua-Simple-XML在GitHub上的文档说明:

<test one="two"> <three four="five" four="six"/> <three>eight</three> <nine ten="eleven">twelve</nine>
</test>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

可以通过两种方式访问值:

使用简单的方法:

xml.test["@one"] == "two"
xml.test.nine["@ten"] == "eleven"
xml.test.nine:value() == "twelve"
xml.test.three[1]["@four"][1] == "five"
xml.test.three[1]["@four"][2] == "six"
xml.test.three[2]:value() == "eight"

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

或者,如果您的XML稍微复杂一点,您可以这样做:

xml:children()[1]:name() == "test"
xml:children()[1]:children()[2]:value() == "eight"
xml:properties()[1] == {name = "one", value = "two"}

  
 
  • 1
  • 2
  • 3

三.实际使用

function LoadConfigFile()
	-- 读取本地文件
	-- local xmlDoc = xml:loadFile("E:\\project\\client_3_0\\Assets\\Resources\\GameRule\\Test.xml")
	-- 
	-- 读取Resources下的文件 -- 注意要在 CustomSettings.cs脚本中添加 _GT(typeof(TextAsset)),
	local textAsset = resMgr:LoadAsset("GameRule/Test");
	if textAsset == nil then
		logError("未读取到的文件:",GAME_KIND_WORD[Cur_GameKind],gameKind);
		return;
	end
	//读取XML文件
	local xmlDoc = xml:ParseXmlText(textAsset.text);
	print(type(xmlDoc))

	--[[ 看看读取到的表中的属性有什么
	for k,v in pairs(xmlDoc) do print(k,v)
	end
	RuleRoot	table: 0x36d26498
	addProperty	function: 0x36d288b8
	children	function: 0x36d287c8
	addChild	function: 0x36d28828
	___value	<!-- 第一行数据 -->

	properties	function: 0x36d28858
	setValue	function: 0x36d24760
	setName		function: 0x36d28798
	numProperties	function: 0x36d28888
	value		function: 0x36d28608
	__props		table: 0x36d285c0
	numChildren	function: 0x36d287f8
	name		function: 0x36d286a0
	___children	table: 0x36d28578
	]] -- 一级节点的子节点数
	print(xmlDoc:numChildren())
	-- 第一个二级节点的名字
	print(xmlDoc:children()[1]:name())
	-- 第一个二级的节点的子节点数
	print(xmlDoc:children()[1]:numChildren()) -- 一级节点
	local rootRule = xmlDoc:children()[1];
	-- 二级节点
	local root = rootRule:children()[1];

	-- 遍历子节点
	for i = 1, root:numChildren() do
		local rowNode = root:children()[i]; -- C#中获取名字这样写 rowNode.Name
		if rowNode:name() == "row" then print("子节点的名字是:Row 处理逻辑 todo...");
		end -- 获取属性 C#: rowNode.Attributes["ruleName"]
		if rowNode["@ruleName"] ~= nil then print("子节点存在ruleName属性 todo..."); end -- 获取属性的值 C#:rowNode.Attributes["txt"].Value;
		local data = rowNode["@txt"]; --获取指定的子节点 C#:root.SelectSingleNode("groups");
		local groupsNode = root.groups;
	end
end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68


遇到的一个问题: 在使用过程中,我的XML如下,

<test one ="two">
</test>

  
 
  • 1
  • 2

我这样获取这个one的属性是取不到的,

local data = rowNode["@one"]

  
 
  • 1

经验证,是因为上面one后面多个空格造成的,具体原因我还不清楚,希望有知道的大佬告知,希望你不要犯这样的错误哦!

文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。

原文链接:czhenya.blog.csdn.net/article/details/105506253

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200