【问题标题】:Adding Namespaces to a DOM Element python将命名空间添加到 DOM 元素 python
【发布时间】:2016-07-08 09:57:50
【问题描述】:

我想用pythonminidom 生成这个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?我是不是忘记了什么?

【问题讨论】:

    标签: python dom namespaces xml-namespaces minidom


    【解决方案1】:

    全面披露:我不使用 minidom 处理 XML,我使用 lxml,除此之外,我不经常使用 XML,所以我希望我的回答会有所帮助。 p>

    人们可能期望通过设置具有特定名称空间的属性,就不需要在最终的书面 XML 文档中显式声明出现在本地名称之前的前缀 - 毕竟,应该可以检测到已使用命名空间并且在完整的属性名称中需要一个前缀,以便将该属性识别为与该命名空间相关联。不幸的是,我们似乎没有那么奢侈,并且在设置这样的属性时必须明确指定前缀作为限定名称的一部分

    Python and XML: An Introduction(跳到属性部分)

    这应该可以解决您的问题:

    root_xml.setAttributeNS("xmls", "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
    

    如您所知,setAttributeNS 方法采用三个参数:namespaceURI、qualifiedName、value。如果元素没有具有相同 namespaceURI 和 localname 的属性,则添加该属性 - 我们通过使用函数 _nssplit 对qualifiedName 进行拆分来获取本地名称。否则,该方法会尝试更新属性的值。

    但是属性的名称是前缀(qualifiedName 在冒号标点之前的部分)和本地名称"%s:%s" % (prefix, localName) 的组合。如果不存在前缀,则属性名称与qualifiedName 参数相同。

    如果您不关心属性的 namespaceURI,您可以只使用 setAttribute 方法获得相同的结果,就像使用第一个和最后一个属性一样。在这种情况下,该方法将查找具有相同属性名称的属性。如果它找到一个,它会尝试覆盖它的值。

    我确实有一个问题:为什么要绑定root = document.appendChild(root_xml)?是为了避免你的 REPL 中的返回值吗?我明白了。

    【讨论】:

    • 非常感谢您的回答。我更好地理解了 setAttributesNS,它帮助我解决了我的问题!对于您的问题,我绑定了root = document.appendChild(root_xml),因为我发现它对我来说更容易理解,因为我将根赋予其他函数以在其中添加子项。
    • 很高兴听到这个消息!感谢您对root的回答。
    猜你喜欢
    • 2019-11-17
    • 2017-11-27
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多