【问题标题】:Simple dom traversing in Python using xml.etree.ElementTree使用 xml.etree.ElementTree 在 Python 中进行简单的 dom 遍历
【发布时间】:2014-02-04 10:52:15
【问题描述】:

例如考虑解析pom.xml 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <parent>
        <groupId>com.parent</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <modelVersion>2.0.0</modelVersion>
    <groupId>com.parent.somemodule</groupId>
    <artifactId>some_module</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>Some Module</name>
    ...

代码:

import xml.etree.ElementTree as ET

tree = ET.parse(pom)
root = tree.getroot()

groupId = root.find("groupId")
artifactId = root.find("artifactId")

groupIdartifactId 都是 None。为什么当他们是根的直系后代时?我试图用tree (groupId = tree.find("groupId")) 替换root,但这并没有改变任何东西。

【问题讨论】:

标签: python xml dom elementtree


【解决方案1】:

问题是你没有有一个名为groupId的孩子,你有一个名为{http://maven.apache.org/POM/4.0.0}groupId的孩子,因为etree不会忽略XML命名空间,它使用“通用名称” .请参阅 effbot 文档中的 Working with Namespaces and Qualified Names

【讨论】:

  • 我可以让它忽略命名空间吗?
  • @amphibient:不直接,不。如果您阅读我链接的文档页面,它会向您展示正确处理此问题的各种方法。
  • @amphibient:这不是迟钝;如果您忽略它们,使用名称空间来解决歧义问题的 XML 将被破坏。 (XML 作为一个整体有点迟钝,但那是另一回事……)对于快速而肮脏的脚本,您需要像 BeautifulSoup 这样的快速而肮脏的解析器,而不是试图正确的解析器。
  • @amphibient: 无论如何,我可以给你代码来解决你的问题,但是如果你不真正理解命名空间和通用名称,那么这些代码对你没有任何好处,所以你几乎必须阅读该文件。如果您之后有任何问题,我可以提供帮助。
  • 我认为“延迟”是无法忽略命名空间并使用它,就好像根只是 &lt;project&gt; 而不是 &lt;project xmlns="..."&gt;。为什么没有一个功能可以忽略它以简化处理?
【解决方案2】:

只是为了扩展 abarnert 对 BeautifulSoup 的评论,如果您只想快速而肮脏地解决问题,这可能是最快的方法。我已经实现了这个(用于个人脚本),它使用 bs4,您可以在其中遍历树

element = dom.getElementsByTagNameNS('*','elementname')

这将使用 ANY 命名空间引用 dom,如果您知道文件中只有一个命名空间,则很方便,因此不会有歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 2012-11-06
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2020-04-18
    相关资源
    最近更新 更多