2011-03-23 72 views
10

fromstring我有壽下面的代碼片段:如何防止xml.ElementTree掉落commentnode

from xml.etree.ElementTree import fromstring,tostring 
    mathml = fromstring(input) 
    for elem in mathml.getiterator(): 
     elem.tag = 'm:' + elem.tag 
    return tostring(mathml) 

當我輸入以下input

<math> 
    <a> 1 2 3 </a> <b /> 
<foo>Uitleg</foo> 
<!-- <bar> --> 
</math> 

它導致:

<m:math> 
    <m:a> 1 2 3 </m:a> <m:b /> 
<m:foo>Uitleg</m:foo> 

</m:math> 

怎麼回事?我怎樣才能保留評論?

編輯:我不關心使用的確切的XML庫,但是,我應該能夠對標籤進行粘貼更改。不幸的是,lxml似乎不允許這樣做(並且我不能使用正確的命名空間操作)

+2

我不認爲這是可能的'xml.etree'的當前實現。註釋節點被解析器剝離開始。 – Santa 2011-03-23 17:43:23

+1

但是,我應該能夠通過使用不同的解析器來解決它? (假設有一個不丟棄評論)。由於ElementTree的確有CommentNode的,你可以創建,所以我希望有某種支持。 – markijbema 2011-03-23 18:18:38

+1

這是真的。 'xml.etree' *可以*創建一個Comment節點並將其序列化爲XML,但不幸的是,它的默認解析器不支持反轉。 – Santa 2011-03-23 23:48:44

回答

14

由於其解析器忽略註釋(這對於xml解析器來說是可接受的行爲),所以不能使用xml.etree。但是,如果您使用(兼容)lxml庫,則可以配置parser options

from lxml import etree 

parser = etree.XMLParser(remove_comments=False) 
tree = etree.parse('input.xml', parser=parser) 
# or alternatively set the parser as default: 
# etree.set_default_parser(parser) 

這將是最簡單的選擇。如果你真的必須使用xml.etree,你可以嘗試連接你自己的解析器,雖然即使這樣,評論也沒有官方的支持:看看this example(來自xml.etree的作者)(似乎仍然在python 2.7順便)

+0

這似乎工作,但是,lxml不允許我的hacky名稱空間,另外(我不想正確地做;我的XML文件後處理未知的腳本,我不知道添加適當的命名空間的後果,因爲它們目前未被使用)。 – markijbema 2011-03-23 21:28:49

+0

你也可以用xml.dom.minidom來做到這一點; toxml()和toprettyxml()方法都保留註釋。 (我不能輕易使用lxml,因爲我正在編寫一個應該最好是跨平臺的插件,這似乎是使用純Python的最簡單方法。) – 2014-02-01 21:37:17