ElementTree не может запустить findall () для результатов findall () - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть 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="&quot;HxYZGQVeHyt7ImBr&quot;">
        <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="&quot;HxdWRh4MGit7ImBr&quot;" 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.

1 Ответ

1 голос
/ 15 ноября 2011

Проблема в том, что document_node[0] в вашем коде уже ссылается на элемент title, а просмотр его дочерних элементов ничего не возвращает.

...