5

我正在尝试创建一个 XML 文件,使其具有以下骨架,最好使用 Python 2.7 中的 xml.etree 模块:

<?xml version="1.0"?>
<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" thing1="this" thing2="that">
  ....
  <somedata bar="1">
    <moredata whatsit="42"></moredata>
  </somedata>
  ....
</foo>

让我烦恼的是“foo ....”这一行。我尝试使用 nsmap 引入 xsi 和 xsd,但这导致了“无法序列化”错误。

我可以构造或以其他方式破解该行的文本,使其完全符合我的要求,但我想学习使用 xml.etree 以编程方式执行此操作(在这种情况下,不推荐使用外部库)。

我认为这是一种常见的模式,但我只是在 Python 和 etree 的任何地方都找不到它。

4

2 回答 2

5

如果文档中使用了前缀;您可以致电register_namespace()添加它们:

import sys
import xml.etree.ElementTree as etree

xsi =  "http://www.w3.org/2001/XMLSchema-instance"
xsd =  "http://www.w3.org/2001/XMLSchema"
ns = {"xmlns:xsi": xsi, "xmlns:xsd": xsd}
for attr, uri in ns.items():
    etree.register_namespace(attr.split(":")[1], uri)

foo = etree.Element("foo",
    dict(thing1="this", thing2="that")) # put `**ns))` if xsi, xsd are unused
somedata = etree.SubElement(foo, "somedata", dict(bar="1"))
etree.SubElement(somedata, "moredata",
    {"whatsit": "42", etree.QName(xsi, "type"): etree.QName(xsd, "string")})

etree.ElementTree(foo).write(sys.stdout, xml_declaration=True)

否则,如果需要,您可以显式设置属性 ( nsdict)。

于 2013-06-13T12:21:06.747 回答
2
import xml.etree.ElementTree as et

foo = et.Element('foo', **{'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance'}, **{'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema'})
somedata = et.SubElement(foo, 'somedata', bar='1')
moredata = et.SubElement(somedata, 'moredata', whatsit='42')
tree = et.ElementTree(foo)
tree.write('file.xml')
于 2018-12-24T18:01:49.443 回答