2016-07-08 33 views
1

我想生產這種XML文件pythonminidom添加命名空間的DOM元素蟒蛇

<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?我忘了什麼嗎?

回答

1

完全披露:我不使用minidom的XML,我使用lxml,並且我不經常使用XML,所以我希望我的回答會有用。

人們可能期望通過與特定的命名空間設置一個屬性,不會有任何需要顯式聲明前綴的最後,寫XML文檔中的本地名稱前出現 - 畢竟,它應該可以檢測到名稱空間已被使用,並且在完整屬性名稱中需要前綴,以便該屬性被識別爲與該名稱空間相關聯。不幸的是,我們似乎沒有這樣的奢侈,而且必須明確指定一個前綴限定名稱的一部分設置這樣的屬性

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

這應該解決您的問題時, :

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

正如你所知道的setAttributeNS方法有三個參數:的namespaceURI,qualifiedName中,值。如果元素沒有具有相同namespaceURI和localname的屬性,則添加該屬性 - 我們通過使用函數_nssplit對qualifiedName進行拆分來獲取本地名稱。否則,該方法會嘗試更新該屬性的值。

但是,該屬性的名稱是前綴(冒號標點之前的qualifiedName的部分)和本地名稱"%s:%s" % (prefix, localName)的組合。如果不存在前綴,則該屬性的名稱與qualifiedName參數相同。

如果您不關心屬性的namespaceURI,那麼只需使用setAttribute方法即可獲得相同的結果,就像您對第一個和最後一個屬性所做的那樣。在這種情況下,該方法將查找具有相同屬性名稱的屬性。如果它找到一個,它會嘗試覆蓋它的值。

我確實有一個問題:你爲什麼要綁定root = document.appendChild(root_xml)?是否要避免REPL中的返回值?我明白了。

+1

非常感謝你的回答。我更瞭解setAttributesNS,它幫助我解決了我的問題!對於你的問題,我綁定了'root = document.appendChild(root_xml)',因爲我發現它對我來說更容易理解,因爲我給其他函數的根添加了子元素。 – user3314570

+0

很高興聽到!並感謝你對'root'的回答。 – dasdachs