我想用python
和minidom
生成这个xml文件:
<xml vesion="1.0" encoding="utf-8?>
<package name="Operation" xmlns="http://www.modelIL.eu/types-2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.modelIL.eu/types-2.0 modelIL-package-2.0.xsd">
</package>
我已经写了这个:
import xml.dom.minidom as dom
document = dom.Document()
root_xml = document.createElement("package")
root_xml.setAttribute("name", "Operation")
root_xml.setAttributeNS("", "xmlns", "http://www.modelIL.eu/types-2.0")
root_xml.setAttributeNS("xmls", "xsi", "http://www.w3.org/2001/XMLSchema-instance")
root_xml.setAttribute("xsi:schemaLocation", "http://www.modelIL.eu/types-2.0 modelIL-package-2.0.xsd")
root = document.appendChild(root_xml)
print(document.toprettyxml(indent(" "))
但是我得到的输出是这样的:
<xml vesion="1.0" ?>
<package name="Operation" xmlns="http://www.modelIL.eu/types-2.0" xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.modelIL.eu/types-2.0 modelIL-package-2.0.xsd">
</package>
为什么我只有xsi
而没有xmlns:xsi
?我忘记了什么吗?
完全披露:我不对XML使用minidom,我使用lxml,最重要的是我不经常使用XML,所以我希望我的答案会有用。
人们可能会期望,通过设置具有特定命名空间的属性,就不需要在最终的书面 XML 文档中显式声明前缀出现在本地名称之前 - 毕竟,应该可以检测到已使用命名空间,并且完整属性名称中需要前缀,以便将属性识别为与该命名空间相关联。不幸的是,我们似乎没有那么奢侈,并且在设置此类属性时必须明确指定前缀作为限定名称的一部分
Python 和 XML:简介(跳到 Atributes 部分)
这应该可以解决您的问题:
root_xml.setAttributeNS("xmls", "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
如您所知,setAttributeNS 方法有三个参数:namespaceURI、qualifiedName、value。如果元素没有具有相同命名空间URI和本地名称的属性,则添加该属性 - 我们通过使用函数_nssplit对限定名称进行拆分来获取本地名称。否则,该方法会尝试更新属性的值。
但是,属性的名称是前缀(冒号标点符号之前的限定名称部分)和本地名称"%s:%s" % (prefix, localName)
的组合。如果不存在前缀,则属性的名称与限定名称参数相同。
如果您不关心属性的命名空间URI,则可以仅使用 setAttribute 方法获得相同的结果,就像处理第一个和最后一个属性一样。在这种情况下,该方法将查找具有相同属性名称的属性。如果找到一个,它将尝试覆盖它的值。
我确实有一个问题:你为什么要绑定root = document.appendChild(root_xml)
?是为了避免 REPL 中的返回值吗?我明白。