2017-09-25 91 views
1

我使用python和lxml庫從頭開始創建一個新的xml文件。如何使用lxml將名稱空間包含到xml文件中?

<route xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.xxxx" version="1.1" 
xmlns:stm="http://xxxx/1/0/0" 
xsi:schemaLocation="http://xxxx/1/0/0 stm_extensions.xsd"> 

我需要將此名稱空間信息作爲路由標記的屬性包含到根標記中。

我不能在根聲明中包含這些信息。

from lxml import etree 
root = etree.Element("route", 
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance", 
    xmlns = "http://www.xxxxx", 
    version = "1.1", 
    xmlns: stm = "http://xxxxx/1/0/0" 
) 

有一個語法錯誤:無效的語法

我怎樣才能做到這一點?

+0

[Python:命名空間在XML ElementTree(或lxml)]中可能的重複](https://stackoverflow.com/questions/4886189/python-namespaces-in-xml-elementtree-or-lxml) – stovfl

+0

@stovfl:I不要認爲它是重複的。這個問題是關於創建一個新的XML文檔;另一個是關於解析/操作現有文檔。 – mzjn

回答

1

這裏是如何可以做到:

from lxml import etree 

attr_qname = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation") 
nsmap = {None: "http://www.xxxx", 
     "stm": "http://xxxx/1/0/0", 
     "xsi": "http://www.w3.org/2001/XMLSchema-instance"} 

root = etree.Element("route", 
        {attr_qname: "http://xxxx/1/0/0 stm_extensions.xsd"}, 
        version="1.1", 
        nsmap=nsmap) 

print etree.tostring(root) 

輸出代碼(換行已經添加了可讀性):

<route xmlns:stm="http://xxxx/1/0/0" 
     xmlns="http://www.xxxx" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xxxx/1/0/0 stm_extensions.xsd" 
     version="1.1"/> 

主要的「絕招」是使用QName來創建xsi:schemaLocation屬性。其名稱中冒號的屬性不能用作關鍵字參數的名稱。

我已將xsi前綴的聲明添加到nsmap,但它實際上可以省略。 lxml爲一些知名的命名空間URI定義了默認的前綴,其中爲http://www.w3.org/2001/XMLSchema-instance

相關問題