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 的文件夹下面,所有我创建局部变量是下图这样写的:
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>

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

使用简单的方法:

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"

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

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

三.实际使用

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


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

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

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

local data = rowNode["@one"]

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

猜你喜欢

转载自blog.csdn.net/Czhenya/article/details/105506253