Lua模式替换

时间:2014-08-19 17:13:05

标签: xml lua lua-patterns

获得以下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服务作为String返回,我想要的是将该结构转换为:

<?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>"

问题是模式返回节点的整个内容,在替换阶段,它接受第一个节点名称,创建标签,然后用它来包装其他所有内容。

2 个答案:

答案 0 :(得分:2)

试试这个:

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)

答案 1 :(得分:1)

不要使用正则表达式。使用xml库和/或xsl转换。

相关问题