使用lua解析和修改xml文件中的数据值

参考自此主题:https://stackoverflow.com/questions/32878542d

使用lua在不使用任何特殊的lua库的情况下,如何解析xml文件中的数据并更改值?

例子:MyTest.xml

<mapList>
<map>
<type>没有地图</type>
<packId>8060</packId>
<id>1</id>
<name>没有地图</name>
<desc>没有地图</desc>
<funnyDesc>对我来说,生活的很多事情似乎都是由纯粹的随机决定的。 - Sidney Poitier</funnyDesc>
<mapData>
<node row="0,0,0,0,0,0,0,0,0,0"/>
<node row="0,0,0,0,0,0,0,0,0,0"/>
<node row="0,0,0,0,0,0,3,0,0,0"/>
<node row="3,3,3,3,0,0,0,3,3,3"/>
<node row="3,3,3,3,3,0,3,3,3,3"/>
<node row="1,5,2,3,0,0,3,3,3,3"/>
<node row="3,3,3,3,0,0,0,3,3,3"/>
<node row="3,3,3,3,3,0,3,3,3,3"/>
<node row="1,5,2,3,0,0,3,3,3,3"/>
<node row="3,3,3,3,0,0,0,3,3,3"/>
<node row="3,3,3,3,3,0,3,3,3,3"/>
<node row="1,5,2,3,0,0,3,3,3,3"/>
<node row="3,3,3,3,0,0,0,3,3,3"/>
<node row="3,3,3,3,3,0,3,3,3,3"/>
<node row="1,5,2,3,0,0,3,3,3,3"/>
<node row="3,3,3,3,0,0,0,3,3,3"/>
<node row="3,3,3,3,3,0,3,3,3,3"/>
<node row="1,5,2,3,0,0,3,3,3,3"/>
<node row="3,3,3,3,0,0,0,3,3,3"/>
<node row="3,3,3,3,3,0,3,3,3,3"/>
</mapData>
</map>

我想获取所有node row="3,3,3,3,3,0,3,3,3,3"并将其更改为node row="1,5,2,3,0,0,3,3,3,3",该值由<type><packId><id><name>进行识别。

非常感谢您的任何帮助。

原文链接 https://stackoverflow.com/questions/48676232

点赞
stackoverflow用户6834680
stackoverflow用户6834680
```lua
local file = assert(io.open("myTest.xml"))  -- 打开文件
local xml = file:read"*a"  -- 读取文件全部内容
file:close()  -- 关闭文件

xml = xml:gsub("<map>.-</map>",  -- 使用正则表达式查找匹配的字符串并替换
   function(s)
      local typ = s:match"<type>(.-)</type>"  -- 获取 type 标签内的值
      local packId = s:match"<packId>(.-)</packId>"  -- 获取 packId 标签内的值
      local id = s:match"<id>(.-)</id>"  -- 获取 id 标签内的值
      local name = s:match"<name>(.-)</name>"  -- 获取 name 标签内的值
      if
         typ    == "No Maps" and  -- 判断条件
         packId == "8060"    and
         id     == "1"       and
         name   == "No Maps"
      then
         return s:gsub("<mapData>.-</mapData>",  -- 再次使用正则表达式查找匹配的字符串并替换
            function(s)
               return s:gsub('<node row="3,3,3,3,3,0,3,3,3,3"/>',  -- 进行具体的替换操作
                             '<node row="1,5,2,3,0,0,3,3,3,3"/>')
            end
         )
      end
   end
)

local file = assert(io.open("myTest2.xml", "w"))  -- 再次打开文件
file:write(xml)  -- 写入修改后的内容
file:close()  -- 关闭文件
2018-02-08 07:43:54