【问题标题】:Python: namespaces in xml ElementTree (or lxml)Python:xml ElementTree(或 lxml)中的命名空间
【发布时间】:2011-06-20 15:32:52
【问题描述】:

我想检索一个旧的 xml 文件,对其进行操作并保存。

这是我的代码:

from xml.etree import cElementTree as ET
NS = "{http://www.somedomain.com/XI/Traffic/10}"

def fix_xml(filename):
    f = ET.parse(filename)
    root = f.getroot()
    eventlist = root.findall("%(ns)Event" % {'ns':NS })
    xpath = "%(ns)sEventDetail/%(ns)sEventDescription" % {'ns':NS }
    for event in eventlist:
        desc = event.find(xpath)
        desc.text = desc.text.upper() # do some editting to the text.

    ET.ElementTree(root, nsmap=NS).write("out.xml", encoding="utf-8")


shorten_xml("test.xml")

我加载的文件包含:

xmlns="http://www.somedomain.com/XI/Traffic/10"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.somedomain.com/XI/Traffic/10 10.xds"

在根标签处。

我有以下与命名空间有关的问题:

  • 如您所见,对于每个标记调用,我都在开始时提供了命名空间来检索一个子项。
  • 生成的 xml 文件开头没有<?xml version="1.0" encoding="utf-8"?>
  • 输出的标签包含<ns0:eventDescription>,而我需要输出为原始<eventDescription>,开头没有命名空间。

如何解决这些问题?

【问题讨论】:

    标签: python xml namespaces elementtree


    【解决方案1】:

    看看lxml tutorial section on namespaces。还有这个article about namespaces in ElementTree

    问题 1:像其他人一样忍受它。而不是"%(ns)Event" % {'ns':NS } 尝试NS+"Event"

    问题 2:默认情况下,仅在需要时才编写 XML 声明。您可以通过在您的 write() 调用中使用 xml_declaration=True 来强制它(仅限 lxml)。

    问题 3:nsmap arg 似乎仅限 lxml。 AFAICT 它需要一个映射,而不是一个字符串。试试nsmap={None: NS}。 effbot 文章有一节描述了解决方法。

    【讨论】:

      【解决方案2】:

      按顺序回答您的问题:

        1234563前缀,仍然需要提供一些前缀到uri的映射。
      • xml_declaration=Trueencoding='utf-8'.write() 调用一起使用(在lxml 中可用,但我相信自python 2.7 起才在stdlib xml.etree 中使用)

      • 我相信 lxml 会按照你的意愿行事

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 2012-05-08
        相关资源
        最近更新 更多