Python - 用于循环的Deep XML文件

时间:2017-03-24 00:18:59

标签: python xml elementtree

我正在使用一个看起来像下面代码的XML文件,真正有一个 spreekbeurt 会话,但我让它可读。我的目标是从所有 spreekbeurt 会话中获取 voorvoegsel achternaam 部分中的文本。

<?xml version="1.0" encoding="utf-8"?>
<officiele-publicatie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://technische-documentatie.oep.overheid.nl/schema/op-xsd-2012-2">
  <metadata>
    <meta name="OVERHEIDop.externMetadataRecord" scheme="" content="https://zoek.officielebekendmakingen.nl/h-tk-20122013-4-2/metadata.xml" />
  </metadata>

  <handelingen>

      <spreekbeurt nieuw="ja">
        <spreker>
          <voorvoegsels>De heer</voorvoegsels>
          <naam>
            <achternaam>Marcouch</achternaam>
          </naam> (<politiek>PvdA</politiek>):</spreker>
        <tekst status="goed">
          <al>Sample Text</al>
        </tekst>
      </spreekbeurt> 

    </agendapunt>
  </handelingen>
</officiele-publicatie>

我使用for循环遍历XML文件中的所有 spreekbeurt 元素。但是如何在我的XML文件中为每个spreekbeurt打印 voorvoegsels achternaam

import xml.etree.ElementTree as ET
tree = ET.parse('...\directory')
root = tree.getroot()

for spreekbeurt in root.iter('spreekbeurt'):
    print spreekbeurt.attrib

此代码打印:

{'nieuw': 'nee'}
{'nieuw': 'ja'}
{'nieuw': 'nee'}
{'nieuw': 'nee'}

但如何让孩子们从 spreekbeurt 中打印出来?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以使用find()传递路径*到目标元素来查找父/祖先中的单个元素,例如:

>>> for spreekbeurt in root.iter('spreekbeurt'):
...     v = spreekbeurt.find('spreker/voorvoegsels')
...     a = spreekbeurt.find('spreker/naam/achternaam')
...     print v.text, a.text
...
De heer Marcouch

*)实际上它不仅支持简单路径,还支持subset of XPath 1.0表达式。