Unity 之 NullReferenceException(空引用异常)问题
799
2022-05-30
Unity 之 Lua中处理XML文件
一.下载xmlSimple.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上的文档说明:
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如下,
1
2
我这样获取这个one的属性是取不到的,
local data = rowNode["@one"]
1
经验证,是因为上面one后面多个
空格
造成的,具体原因我还不清楚,希望有知道的大佬告知,希望你不要犯这样的错误哦!
Lua unity XML
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。