使用Python的lxml包解析XML文件以获得完整的标记

2024-10-16 20:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下XML文件:

<root>

    <scene name="scene1">
        <view ath="0" atv="10"/>
        <image url="img1.jgp"/>
        <hotspot name="hot1"/>
    </scene>

    <scene name="scene2">
        <view ath="20" atv="10"/>
        <image url="img2.jgp"/>
        <hotspot name="hot2"/>
    </scene>

</root>

我正在使用lxml包编写一个Python脚本,以获取scene1内的整个view标记。即:

^{pr2}$

我已经阅读了lxml文档,但是我能找到的只是如何获取标记、其属性或内容,而不是整个标记。在

至少有人能给我指出正确的方向吗?lxml是否有实现这一点的函数或方法?在

谢谢

拉斐尔


Tags: 文件name标记imageviewurlrootxml
2条回答

XML内容是这样一个字符串:

content = u"""\
<root>

    <scene name="scene1">
        <view ath="0" atv="10"/>
        <image url="img1.jgp"/>
        <hotspot name="hot1"/>
    </scene>

    <scene name="scene2">
        <view ath="20" atv="10"/>
        <image url="img2.jgp"/>
        <hotspot name="hot2"/>
    </scene>

</root>
"""

您可以解析一个文件;但是,在这里,我解析一个StringIO:

^{pr2}$

所有内容都加载在ElementTree中。在

要查找视图,我使用XPath表达式:

views = tree.xpath("//scene/view")

结果总是一个列表:

for view in views:
    print(etree.tostring(view, with_tail=False))

您将获得:

<view ath="0" atv="10"/>
<view ath="20" atv="10"/>

您的给定XML源包含一些错误;我修复了这些错误,请参阅下面的源代码:

from lxml import etree

source = """
<root>
  <scene name="scene1">
    <view ath="0" atv="10" />
    <image url="img1.jgp" />
    <hotspot name="hot1" />
  </scene>

  <scene name="scene2">
    <view ath="20" atv="10" />
    <image url="img2.jgp" />
    <hotspot name="hot2" />
  </scene>
</root>
"""

要解析此源,您将创建一个etree:

^{pr2}$

(对于来自文件的源,请改用etree.parse()。)

现在,您可以通过正确访问tree来浏览已解析的XML。我最喜欢的方法是使用xpath导航(掌握这些超出了您的问题范围):

allViews = tree.xpath('//root/scene/view')
for view in allViews:
  print view.attrib

这将打印XPath找到的每个视图标记的所有XML属性:

{'atv': '10', 'ath': '0'}
{'atv': '10', 'ath': '20'}

当然,您也可以访问视图元素的其他属性,比如它们的嵌入文本(这里当然是空的)或它们的子元素(子元素)(当然,在您的示例中它们也没有子元素)。在

您的问题的措辞表明您可能没有建立起这样一个事实的理解,即这个view对象确实是“整个视图标记”。您可以向view对象请求它所组成的标记(view)、属性(见上文)、内容(view.text)甚至子元素(view.getchildren(),但没有)。在

您可以通过调用etree.tostring(view)将已解析的XML结构转换回ASCII表示;这将返回一个类似'<view ath="20" atv="10"/>\n '的字符串。在大多数情况下,你不会这样做。在

您还可以访问元素查看元素的子元素:

print tree.getchildren()[1].getchildren()[0].attrib

这将打印tree元素的第一个子元素(aview)的第0个子元素(aview)的XML属性:

{'atv': '10', 'ath': '20'}

相关问题 更多 >