Python:xml ElementTree(或lxml)中的命名空间

Hel*_*nar 6 python xml namespaces elementtree

我想检索遗留的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")
Run Code Online (Sandbox Code Playgroud)

我加载的文件包含:

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"
Run Code Online (Sandbox Code Playgroud)

在根标签处.

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

  • 正如您所看到的,对于每个标记调用,我都在开始时给命名空间提供一个孩子.
  • 生成的xml文件<?xml version="1.0" encoding="utf-8"?>在开头没有.
  • 输出中的标签包含这样的内容,<ns0:eventDescription>而我需要输出作为原始输出<eventDescription>,在开头没有命名空间.

这些如何解决?

Joh*_*hin 6

查看名称空间lxml教程部分.另外这个文章关于ElementTree的命名空间.

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

问题2:默认情况下,仅在需要时才写入XML声明.您可以xml_declaration=Truewrite()通话中强制使用它(仅限lxml).

问题3:nsmaparg似乎只是lxml.AFAICT需要MAPping,而不是字符串.试试nsmap={None: NS}.effbot文章有一节描述了解决方法.