Я столкнулся с небольшой проблемой.Я работаю над тем, что выплевывает всю структуру xpath XML-файла в список, поэтому конечным результатом будет просто список xpath, например
[/pma:message, /pma:message/body, ...]
Когда у меня есть XML-файл, который не 'у меня нет содержимого пространства имен, например,
<body>
<p>When the new Mexican President Andrés Manuel López Obrador</p>
<p>INTERIOR VIOLENCE</p>
</body>
Я получаю правильный вывод
/body/p[1]
/body/p[2]
Но как только у меня есть содержимое пространства имен (Uris, конечно, отображается сверхудокумента), например.
<pam:article xml:lang="en-US"><prism:publicationName>Time</prism:publicationName>
<body>
<p>When the new Mexican President Andrés Manuel López Obrador</p>
<p>INTERIOR VIOLENCE</p>
</body>
</pam:article>
Я начинаю получать результаты, которые выглядят следующим образом:
/pam:article/*[2]
Что, очевидно, не идеально.Мой код очень прост, и он выглядит следующим образом.
def get_xpathlist(file):
parser = etree.XMLParser(ns_clean=True)
tree = etree.parse(file, parser)
return [element.getroottree().getpath(element) for element in tree.iter()]
Кажется, это ошибка пространства имен.Когда я переключаю
element.getroottree().getpath(element)
на
tree.getelementpath(element)
, я получаю полностью определенные xpaths, за исключением тега {namespace}.Мне нужно сокращенное пространство имен: нотация тегов
Мой вопрос состоит из двух частей:
Как мне получить полностью определенный xpath, чтобы '/ *' было актуальнымxpath (также пространства имен являются переменными, и я не могу объявить их заранее, если я не создам утилиту для их анализа).Это то, что я могу сделать с помощью lxml, или мне нужно использовать строковые манипуляции для достижения этого?
Если я хочу удалить квадратные скобки из вывода (меня действительно волнует толькопервое появление xpath, а не вложенность) есть ли способ сделать это с помощью lxml или это опять-таки просто манипулирование строками?
Большое спасибо за помощь!