Получение списка (полностью) квалифицированных xpath с укороченными пространствами имен - PullRequest
0 голосов
/ 12 декабря 2018

Я столкнулся с небольшой проблемой.Я работаю над тем, что выплевывает всю структуру 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}.Мне нужно сокращенное пространство имен: нотация тегов

Мой вопрос состоит из двух частей:

  1. Как мне получить полностью определенный xpath, чтобы '/ *' было актуальнымxpath (также пространства имен являются переменными, и я не могу объявить их заранее, если я не создам утилиту для их анализа).Это то, что я могу сделать с помощью lxml, или мне нужно использовать строковые манипуляции для достижения этого?

  2. Если я хочу удалить квадратные скобки из вывода (меня действительно волнует толькопервое появление xpath, а не вложенность) есть ли способ сделать это с помощью lxml или это опять-таки просто манипулирование строками?

Большое спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...