【问题标题】:Python: Read and write namespaced XML using ElementTreePython:使用 ElementTree 读写命名空间 XML
【发布时间】:2012-02-29 14:37:45
【问题描述】:

此 XML 文件名为 example.xml:

<?xml version="1.0"?>
<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">

  <modelVersion>14.0.0</modelVersion>
  <groupId>.com.foobar.flubber</groupId>
  <artifactId>uberportalconf</artifactId>
  <version>13-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>Environment for UberPortalConf</name>
  <description>This is the description</description>    
  <properties>
      <birduberportal.version>11</birduberportal.version>
      <promotiondevice.version>9</promotiondevice.version>
      <foobarportal.version>6</foobarportal.version>
      <eventuberdevice.version>2</eventuberdevice.version>
  </properties>
  <!-- A lot more here, but as it is irrelevant for the problem I have removed it -->
</project>

如果我使用 ElementTree 加载上面的 example.xml 文件并打印根节点:

>>> from xml.etree import ElementTree
>>> tree = ElementTree.parse('example.xml')
>>> print tree.getroot()
<Element '{http://maven.apache.org/POM/4.0.0}project' at 0x26ee0f0>

我看到 Element 还包含命名空间 http://maven.apache.org/POM/4.0.0

我该怎么做:

  1. 获取 foobarportal.version 文本,将其加一并写回 XML 文件,同时保持文档在加载时具有的命名空间,并且不更改整体 XML 布局。
  2. 使用任何命名空间加载它,而不仅仅是http://maven.apache.org/POM/4.0.0。我仍然不想剥离命名空间,因为我希望 XML 保持不变,除了更改 foobarportal.version,如上面 1 中所述。

目前的方式不知道XML,但满足上面的12

  1. &lt;foobarportal.version&gt;(.*)&lt;/foobarportal.version&gt;
  2. 取匹配组的内容,我加一
  3. 写回去。

如果有一个支持 XML 的解决方案会很好,因为它会更加健壮。 ElementTree 的 XML 命名空间处理使其变得更加复杂。

【问题讨论】:

  • 我试过tree.getroot().find('project'),由于命名空间,它不起作用。在那之后,我几乎陷入了困境,文档并没有帮助我。
  • 在问题中向我们展示您尝试过的代码。

标签: python elementtree


【解决方案1】:

如果您的问题很简单:“我如何通过命名空间元素名称进行搜索”,那么答案是 lxml 理解 {namespace} 语法,因此您可以这样做:

tree.getroot().find('{http://maven.apache.org/POM/4.0.0}project')

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多