Python ElementTree可以与.iter()一起使用,但不能与.find()一起使用

Python ElementTree可以与.iter()一起使用,但不能与.find()一起使用,python,xml,elementtree,Python,Xml,Elementtree,我是ElementTree的新手。我想获取xml文件的一些值(文本)。当我尝试root.iter()时,输出是许多标记。但是当我尝试root.find('someTag')或root.findall('someTag')时,输出是无的。我不能理解这一点。你能帮助我吗? 请参阅xml文件的一部分: <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/3.2/styl

我是ElementTree的新手。我想获取xml文件的一些值(文本)。当我尝试root.iter()时,输出是许多标记。但是当我尝试root.find('someTag')或root.findall('someTag')时,输出是无的。我不能理解这一点。你能帮助我吗? 请参阅xml文件的一部分:

<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl"       href="/3.2/style/exchange.xsl"?>
<ops:world-patent-data xmlns="http://www.epo.org/exchange" xmlns:ops="http://ops.epo.org" xmlns:xlink="http://www.w3.org/1999/xlink">
<exchange-documents>
    <exchange-document system="ops.epo.org" family-id="19768124" country="EP" doc-number="1000000" kind="A1">
        <bibliographic-data>
            <publication-reference>
                <document-id document-id-type="docdb">
                    <country>EP</country>
                    <doc-number>1000000</doc-number>
                    <kind>A1</kind>
                    <date>20000517</date>
结果是:

{http://ops.epo.org}world-patent-data
{http://www.epo.org/exchange}exchange-documents
{http://www.epo.org/exchange}exchange-document
{http://www.epo.org/exchange}bibliographic-data
{http://www.epo.org/exchange}publication-reference
(...)
如果我尝试:

for x in root.find('{http://www.epo.org/exchange}exchange-document'):
    print(x.tag)
我得到这个错误:

TypeError: 'NoneType' object is not iterable

一种简短而快速的修正方法是:

  • 用findall替换find
  • 由于exchange文档不是根的直接后代,所以请使用prepend XPath带有.//,可以查看任何深度
因此,请将代码更改为:

for x in root.findall('.//{http://www.epo.org/exchange}exchange-document'):
   print(x.tag)
但是在每个XPath中放置完整的名称空间不是一个好主意。 相反,我建议:

  • 定义包含XPath中使用的所有快捷方式和名称空间的字典
  • 在每个XPath中,使用相应的快捷键(+冒号)指定名称空间 作为分隔符),但这次没有周围的大括号
  • 将此字典作为findall中的第二个参数传递
因此,第二种(更具可读性的)变体是:

ns = {'exch': 'http://www.epo.org/exchange'}
for x in root.findall('.//exch:exchange-document', ns):
    print(x.tag)

root.find('{http://www.epo.org/exchange}exchange文档“)
尝试查找第一个
{http://www.epo.org/exchange}交换文档
根目录的子目录。可能没有这样的元素。请提供一个.I过去xml代码的一部分。
交换文档
不是
的子文档;它是一个孙子。而
find()
只能找到一个元素。
ns = {'exch': 'http://www.epo.org/exchange'}
for x in root.findall('.//exch:exchange-document', ns):
    print(x.tag)