Итерация по XML узлам с Lua - PullRequest
3 голосов
/ 19 марта 2020

Я пытаюсь перебрать все узлы '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>

1 Ответ

1 голос
/ 19 марта 2020

Используйте .- вместо .+, так что gmatch('<FindMe.+>.+</FindMe>') становится gmatch('<FindMe.->.-</FindMe>'). Использование - подразумевает не жадный поиск, поэтому он получает наименьшее возможное количество символов до совпадения (вместо максимально возможного количества символов до совпадения с жадным поиском). Вы также можете использовать gmatch('<FindMe[^>]+>.-</FindMe>'), который должен иметь тот же эффект.

...