我的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>
我有很多条目元素,每个元素都包含标题元素。我希望找到哪个条目包含带有特定元素文本的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'。删除它,上面的代码工作。这是错误的原因 - 感谢下面的绅士发现这个!
这会引发没有标题节点的错误。
这些结果似乎很奇怪,如: - 我可以在文档中清楚地看到带有该命名空间的元素 - 我甚至可以使用该命名空间直接运行findall()for title,并查看结果
我想知道findall()返回与其输入不同的类的对象的可能性,但是在任一对象上运行'type'只会返回'instance'作为类型。在ElementTree进行质量编程。
虽然LXML有更好的文档,更好的xpath支持和更好的代码,但由于技术原因,我不能使用LXML ,所以我不得不使用ElementTree。
答案 0 :(得分:1)
问题是您的代码中的document_node[0]
已经引用了title
元素,并且查看其子代没有返回任何内容。