【问题标题】:Finding elements and printing values查找元素和打印值
【发布时间】:2013-03-18 09:51:38
【问题描述】:

我想解析嵌套元素。我不介意使用XPathElement。例如,我想打印的一些值位于:

>>> root[0][0][0][0][0].tag
'{http://www.domain.com/somepath/Schema}element'
>>> root[0][0][0][0][0].text
'findme'

遍历 XML 文档、解析和打印element 值的理想方法是什么?这是我正在使用的架构示例。

<?xml version="1.0" encoding="UTF-8"?>
<data xsi:schemaLocation="http://www.domain.com/somepath/Schema file.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.domain.com/somepath/Schema">
    <one stuff0="" stuff1="">
        <two stuff0="" stuff1="">
            <three>
                <four stuff0="234234" stuff1="234324">
                    <element>findme</element>
                </four>
                <four stuff0="234234" stuff1="234324">
                    <element>findme2</element>
                </four>
                <four stuff0="234234" stuff1="234324">
                    <element>findme3</element>
                </four>
            </three>
        </two>  
    </one>
    <one stuff0="" stuff1="">
        <two stuff0="" stuff1="">
            <three>
                <four stuff0="234234" stuff1="234324">
                    <element>findme4</element>
                </four>
                <four stuff0="234234" stuff1="234324">
                    <element>findme5</element>
                </four>
                <four stuff0="234234" stuff1="234324">
                    <element>findme6</element>
                </four>
            </three>
        </two>  
    </one>
</data>

我尝试了以下方法,但没有返回结果。即使这确实有效,它也不会看到 root1[0]1[0][0] 下的元素等等:

>>> for tagname in root[0][0][1][0][0].findall('element'):
...   name = tree.get('element')
...   print name
...
>>>

根据这个question,我也尝试了以下方法但没有成功:

>>> for elem in doc.findall('one/two/three/four'):
...     print value.get('stuff1'), elem.text
...
>>>

发现问题:

由于缺乏命名空间规范,我在阅读Need Help using XPath in ElementTree 后了解到该元素没有被读取。所以下面的例子有效:

>>> import xml.etree.cElementTree as ET
>>> for event, element in ET.iterparse("schema.xml"):
...     if element.tag == "{http://www.domain.com/somepath/Schema}element":
...        print element.text
...
findme
findme2
findme3
findme4
findme5
findme6

【问题讨论】:

  • 您链接到的任何一个库都可以。
  • 我推荐 cElementTree 超过 elementtree 模块。它是编译的 C 代码,因此运行速度稍快一点,使用的内存更少,但与 elementtree 的接口非常相似。

标签: python xml xml-parsing


【解决方案1】:

如果没有看到您的 XML 文档,我无法确定,但我认为您想要做的是:

test.xml

<?xml version="1.0"?>
<root>
  <group>
    <element>This is the first text</element>
  </group>
  <group>
    <element>This is the second text</element>
  </group>
  <group>
    <element>This is the third text</element>
  </group>
</root>

test.py

import xml.etree.cElementTree as ET

for event, element in ET.iterparse("test.xml"):
    if element.tag == "element":
       print element.text

在我得到的终端中运行这些文件:

mike@tester:~$ python test.py
This is the first text
This is the second text
This is the third text

【讨论】:

  • 这是我正在寻找的,虽然它没有打印输出。我已经用架构示例更新了问题。
  • 我的问题是命名空间使用(有问题已更新)。在您的示例中,我该如何处理命名空间?
  • 要处理命名空间使用"{namespace-uri}element" 而不是"element"。或者ET.QName("namespace-uri","element).
  • 成功了,问题会根据您的答案/命名空间使用情况进行更新。谢谢
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2019-07-30
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
相关资源
最近更新 更多