2013-06-04 111 views
1

我想用Python的ElementTree API(和lxml)編寫簡單的SOAP響應。編寫SOAP響應涉及使用名稱空間編寫元素文本(值)。 For an example, click here.Python XML命名空間元素文本

使用名稱空間編寫元素並不是一個大問題,但某些元素包含具有名稱空間的文本。

我想創造的東西,如:

<pleh:a xmlns:pleh="http://pleh">pleh:x</pleh:a> 

那麼 '自然' 我做的:

try: 
    from lxml import etree 
except ImportError: 
    import xml.etree.ElementTree as etree 

pleh = 'http://pleh' 
etree.register_namespace('pleh', pleh) 
a = etree.Element('{%s}a' % pleh) 
a.text = '{%s}x' % pleh 
print(etree.tostring(a)) 

但這打印<pleh:a xmlns:pleh="http://pleh">{http://pleh}x</pleh:a>

缺少什麼我在這裏?

+0

你找到一個解決方案siebz0r? – Priyeshj

+0

@Priyeshj不幸的是沒有。 – siebz0r

回答

0

沒有「名稱空間元素文本」或「具有名稱空間的文本」之類的東西。您的元素整體被綁定到一個名稱空間,這是真的。但元素文本內容pleh:x只是一個普通的字符串。 pleh位恰好是與元素名稱空間相關的(任意)前綴,但就XML名稱空間而言,它並不重要。


在這裏你創建一個XML元素,在http://pleh命名空間:

a = etree.Element('{%s}a' % pleh) 

花括號解釋爲命名空間URI的分隔符。這被稱爲"Clark notation"。大括號不出現在序列化的XML中。

在這裏,你創建一個字符串:

a.text = '{%s}x' % pleh 

元素的文本內容變得{http://pleh}x。這不是你所期望的,但它完全合乎邏輯(這不是lxml中的錯誤)。

如果您需要的文本內容是pleh:x,只需使用a.text = 'pleh:x'

+0

在兩種情況下均應用了字符串格式,但XML模塊對它們的處理方式不同。我明白這在XML上下文中並不合理,但這是SOAP。由於SOAP的靜態性質,它需要一些文本纔能有一個名稱空間。這在我的問題鏈接的例子中得到了證明。 – siebz0r