Lua模式替换

获得以下 XML 结构:

<?xml version="1.0" encoding="UTF-16"?>
<xml>
   <v id="Node_Name_1">Node_1_Value</v>
   <v id="Node_Name_2">Node_2_Value</v>
   <v id="Node_Name_3">Node_3_Value</v>
   <v id="Node_Name_4">Node_4_Value</v>
</xml>

以上结构作为字符串由 Web 服务返回,我想将其转换为:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
   <Node_Name_1>Node_1_Value</Node_Name_1>
   <Node_Name_2>Node_2_Value</Node_Name_2>
   <Node_Name_3>Node_3_Value</Node_Name_3>
   <Node_Name_4>Node_4_Value</Node_Name_4>
</xml>

这是我的代码:

local pattern = '(<v id="(.+)">(.+)</v>)'
local rplcmnt = "<%1>%2</%1>"
local endXml = string:gsub(orgXml, pattern, rplcmnt)
local endStr = "<?xml version='1.0' encoding='UTF-8'?><xml>"..endXml.."</xml>"

问题是模式返回节点的整个内容,在替换阶段它获取第一个节点名称,创建标签,然后将其用于包装其他一切。

点赞
用户258523
用户258523

不要使用正则表达式来完成这个任务。可以使用一个 XML 库和/或 XSL 转换。

2014-08-19 17:17:29
用户107090
用户107090

尝试一下:

local pattern = '(<v id="(.-)">(.-)</v>)'
local rplcmnt = "<%2>%3</%2>"
local endXml = string.gsub(orgXml, pattern, rplcmnt)

跟你的代码不一样的地方是:

  • 非贪婪匹配使用了 .- 而不是 .+

  • 正确的替换模式,因为 Lua 中的索引从 1 开始而不是从 0 开始。

  • 使用了 string.gsub 而不是 string:gsub

    你还可以使用 orgXml:gsub(pattern, rplcmnt)

2014-08-19 17:49:02