Xml Lua模式替换

Xml Lua模式替换,xml,lua,lua-patterns,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

获取了以下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>

节点_1_值
节点_2_值
节点_3_值
节点_4_值
上面的结构由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>

节点_1_值
节点_2_值
节点_3_值
节点_4_值
这是我的代码:

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>"
localpattern='((.+)'
本地rplcmnt=“%2”
local endXml=string:gsub(orgXml、模式、rplcmnt)
本地endStr=“…endXml…”

问题是模式返回节点的全部内容,在替换阶段,它取第一个节点名,创建标记,然后将其用于包装所有其他内容。

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

尝试以下方法:

local pattern = '(<v id="(.-)">(.-)</v>)'
local rplcmnt = "<%2>%3</%2>"
local endXml = string.gsub(orgXml, pattern, rplcmnt)
localpattern='((.-)'
本地rplcmnt=“%3”
local endXml=string.gsub(orgXml、pattern、rplcmnt)
与代码的区别是:

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

  • 正确的替换模式,因为Lua中的所有内容都从1开始,而不是从0开始

  • 使用
    string.gsub
    代替
    string:gsub

    您还可以使用
    orgXml:gsub(模式,rplcmnt)


如果您的正则表达式类似于
'((.+?)”,那就更好了。
您真的想将UTF-16转换为UTF-8吗?只有当您希望文档中有嵌套的
标记时,才需要特殊的XML解析器。您能在没有XML解析器的情况下“解析”或“转换”任意微小的XML片段吗?可能地你应该吗?可能不是。这里没有“随机xml片段”。XML结构树是预先知道的。一行Lua代码就足以执行任务。“随机”的意思是,它可以是任何“事先已知”的“XML结构树”。不像“xml数据可以是随机的”那样是“随机的”。正如我所说,您可以为任何给定的(足够简单的)xml树定制模式,但您不应该这样做。您应该为此作业使用正确的工具,因为您迟早会需要这些工具。是否将正则表达式用于简单的xml作业有点像holywar:-)