К вашему сведению, правда, было очень интересно. и подстановочные знаки пространства имен являются «безопасными», если я не знаю, какие префиксы используются.

ак у меня был этот раздражающий вопрос во второй раз, я подумал, что вопрос поможет.

Иногда мне приходится получать элементы из документов XML, но способы сделать это неудобны.

Мне бы хотелось знать библиотеку Python, которая делает то, что я хочу, элегантный способ формулирования моих XPath, способ автоматической регистрации пространств имен в префиксах или скрытый параметр в встроенных реализациях XML или в lxml для полного удаления пространств имен. Разъяснение следует, если вы уже не знаете, чего я хочу :)

Пример-документ:

<root xmlns="http://really-long-namespace.uri"
  xmlns:other="http://with-ambivalent.end/#">
    <other:elem/>
</root>
Что я могу сделать

ElementTree API является единственным встроенным (я знаю), обеспечивающим запросы XPath. Но это требует, чтобы я использовал «UNames». Это выглядит так:/{http://really-long-namespace.uri}root/{http://with-ambivalent.end/#}elem

Как видите, они довольно многословны. Я могу сократить их, выполнив следующие действия:

default_ns = "http://really-long-namespace.uri"
other_ns   = "http://with-ambivalent.end/#"
doc.find("/{{{0}}}root/{{{1}}}elem".format(default_ns, other_ns))

Но это одновременно {{{ugly}}} и хрупкое, так какhttp…end/#http…end#http…end/http…endи кто я, чтобы знать, какой вариант будет использоваться?

Кроме того, lxml поддерживает префиксы пространств имен, но не использует ни те, что в документе, ни предоставляет автоматический способ обработки пространств имен по умолчанию. Мне все равно придется получить один элемент каждого пространства имен, чтобы извлечь его из документа. Атрибуты пространства имен не сохраняются, поэтому нет способа автоматически извлечь их из них.

Существует также независимый от пространства имен способ запросов XPath, но он является как подробным, так и уродливым и недоступным во встроенной реализации:/*[local-name() = 'root']/*[local-name() = 'elem']

Что я хочу сделать

Я хочу найти библиотеку, опцию или общую функцию XPath-morphing для достижения приведенных выше примеров, набрав немного больше, чем следующее ...

Unnamespaced:/root/elemПрефиксы пространства имен из документа:/root/other:elem

… Плюс, может быть, некоторые утверждения, что я действительно хочу использовать префиксы документа или лишить пространства имен.

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

Спасибо за чтение!

решаемая

Пользователь samplebias обратил мое внимание нару-дом-XPath; Именно то, что я искал. Мой настоящий код теперь выглядит так:

#parse the document into a DOM tree
rdf_tree = xml.dom.minidom.parse("install.rdf")
#read the default namespace and prefix from the root node
context = xpath.XPathContext(rdf_tree)

name    = context.findvalue("//em:id", rdf_tree)
version = context.findvalue("//em:version", rdf_tree)

#<Description/> inherits the default RDF namespace
resource_nodes = context.find("//Description/following-sibling::*", rdf_tree)

В соответствии с документом, простой, с учетом пространства имен; идеальный.

Ответы на вопрос(2)

Ваш ответ на вопрос