Lua 中遍历 XML 节点

我正在尝试遍历所有的“FindMe”节点,但我在模式匹配方面遇到了困难。这将作为另一个软件的插件使用,因此我试图避免使用解析库。

给定以下 xml

<?xml version="1.0" encoding="utf-8"?>
<NodeA>
    <NodeB>
        <FindMe attr="1">
            <NodeC attr="1" />
        </FindMe>
        <FindMe attr="2">
            <NodeC attr="2" />
        </FindMe>
    </NodeB>
</NodeA>

当我尝试这样做时,它只打印最后一个匹配项

for k, _ in src:gmatch(".+(<FindMe .+</FindMe>).+") do
    print(k)
end
<FindMe attr="2">
    <NodeC attr="2" />
</FindMe>

当我尝试这样做时,它将所有匹配的节点打印为一个结果

for k, _ in src:gmatch('<FindMe.+>.+</FindMe>') do
    print(k)
end
<FindMe attr="1">
    <NodeC attr="1" />
</FindMe>
<FindMe attr="2">
    <NodeC attr="2" />
</FindMe>
点赞
用户1442917
用户1442917

使用 .- 替代 .+,使得 gmatch('<FindMe.+>.+</FindMe>') 变成 gmatch('<FindMe.->.-</FindMe>')。使用 - 意味着非贪心搜索,所以它获取的是直到匹配为止的最少字符数量(而不是使用贪心搜索获取直到匹配为止的最大可能字符数量)。你也可以使用 gmatch('<FindMe[^>]+>.-</FindMe>'),这应该会产生相同的效果。

2020-03-19 05:48:25