Разбор XML-файла с помощью модуля LPeg.

Я пытаюсь выучить LPeg's re module и это был довольно интересный опыт, тем более что официальная документация так хороша.

Однако есть некоторые темы, которые, кажется, там плохо объяснены. Например, named group capture строительство: {:name: p :},

Рассмотрим следующий пример, я не понимаю, почему он не совпадает:

print(re.compile
  [[item <- ('<' {:tag: %w+!%w :} '>' item+ '</' =tag '>') / %w+!%w]]
  :match[[<person><name>James</name><address>Earth</address></person>]])

-- outputs nil

Может кто-нибудь помочь мне понять, что здесь происходит не так? Я много думал об этом, и мне действительно кажется, что я упускаю что-то важное.

1 ответ

Решение

Это поздний ответ, но вы можете попробовать следующую схему

result = re.compile[[
  item <- ({| %s* '<' {:tag: %w+ :} %s* '>' (item / %s* { (!(%s* '<') .)+ }) %s* '</' =tag '>' |})+
]]:match[[
<person>
    <name>
    James
    </name>
    <address>Earth</address>
</person>
]]

который использует захваты таблиц для разбора XML с пробелами для вырезанных текстов элементов

tag = "person"
[1] = {
  tag = "name"
  [1] = "James"
}
[2] = {
  tag = "address"
  [1] = "Earth"
}
Другие вопросы по тегам