У меня есть XML в форме, подобной следующей:
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:docs="http://schemas.google.com/docs/2007" xmlns:batch="http://schemas.google.com/gdata/batch"
<entry gd:etag=""HxYZGQVeHyt7ImBr"">
<title>Some document title I wish to find</title>
У меня есть много элементов entry , каждый из которых содержит элемент title .Я хочу выяснить, какая запись содержит элемент заголовка с определенным текстом элемента.
Я могу прекрасно перебрать каждый элемент с помощью следующего кода:
entry = './/{http://www.w3.org/2005/Atom}entry'
document_nodes = document_feed_xml.findall(entry)
for document_node in document_nodes:
logging.warn('entry item found!')
logging.warn(pretty_print(document_node))
logging.warn('-'*80)
Это работает, возвращая:
WARNING:root:--------------------------------------------------------------------------------
WARNING:root:entry item found!
<ns0:entry ns1:etag=""HxdWRh4MGit7ImBr"" xmlns:ns0="http://www.w3.org/2005/Atom" xmlns:ns1="http://schemas.google.com/g/2005">
<ns0:title>
Some document title
</ns0:title>
</ns0:entry>
Так что теперь я хотел бы найти элемент title в этой ветви дерева.если я ищу:
title = './/{http://www.w3.org/2005/Atom}title'
title_nodes = document_node.findall(title)
for title_node in title_nodes:
logging.warn('yaaay')
logging.warn(title_node.text)
if not title_nodes:
raise ValueError('Could not find any title elements in this entry')
Редактировать: у меня изначально был «document_node [0] .findall» из некоторой отладки.Удаление этого кода выше работает.Это было причиной ошибки - спасибо приведенному ниже джентльмену за то, что он это заметил!
Это приводит к ошибке при отсутствии узлов заголовка.
Эти результаты кажутся странными, так как: - IЯ могу четко видеть этот элемент с этим пространством имен в документе - я даже могу запустить findall () для заголовка напрямую, используя это пространство имен, и посмотреть результаты
Я задавался вопросом о возможности findall ()возвращая объекты, которые имеют класс, отличный от его входных данных, однако выполнение 'type' на любом объекте просто возвращает 'instance' в качестве типа.Качественное программирование там ElementTree.
Хотя LXML имеет лучшую документацию, лучшую поддержку xpath и лучший код по техническим причинам, Я не могу использовать LXML , поэтому я вынужден использовать ElementTree.