Unity 之 Lua中读取处理XML文件
一.下载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 的文件夹下面,所有我创建局部变量是下图这样写的:
读取代码:
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
- 点赞
- 收藏
- 关注作者
评论(0)