2010-12-17 62 views
11

目前使用Python 2.4.3,並且不允許升級如何保持意見,同時解析使用Python/XML ElementTree的

我想改變一個或多個標籤給定的屬性值,一起在更新的文件中使用XML註釋。

我已成功地創建一個Python腳本,需要一個XML文件作爲參數,並指定每個標籤更改了屬性,如下圖所示

def update(file, state): 
    global Etree 
    try: 
     from elementtree import ElementTree 
     print '*** using ElementTree' 
    except ImportError, e: 
     print '***' 
     print '*** Error: Must install either ElementTree or lxml.' 
     print '***' 
     raise ImportError, 'must install either ElementTree or lxml' 
    #end try 

    doc = Etree.parse(file) 
    root = doc.getroot() 

    for element in root.findall('.//StateManageable'): 
     element.attrib['initialState'] = state 
    #end for 
    doc.write(file) 
#end def 

這是所有罰款,屬性「的初始化狀態「被更新,除了我的原始XML包含大量的XML註釋這一事實,但它們早已消失,這很糟糕。

犯罪嫌疑人只解析檢索XML的結構,但我認爲XML的意見,其中結構的一部分。我也意識到,我的原始文檔的「人類可讀」格式已經過去了,但我已經意識到是預期的行爲,需要使用xmllint --format或XSL進行格式化。

+3

2.4?我的同情心。 – delnan 2010-12-17 21:08:34

+0

你打賭,我開始創建我的第一個腳本意識到,我發現很好的東西,我發現的例子是2.7 :-) – rhellem 2010-12-17 21:13:16

回答

16

我知道這已經很老了,但我偶然發現了上面有關如何保留評論的答案。 Frederik的published instructions關於如何將註釋放入樹中仍然適用於當前版本的ElementTree,但至少對於我的使用來說,它的作用要大得多。它將XML包裝在一個元素中,這對我來說是不可取的。我也不需要保存處理指令,但只需要註釋。所以,我下調,他所提供的網站,這對類:

import xml.etree.ElementTree as ET 

class PCParser(ET.XMLTreeBuilder): 

    def __init__(self): 
     ET.XMLTreeBuilder.__init__(self) 
     # assumes ElementTree 1.2.X 
     self._parser.CommentHandler = self.handle_comment 

    def handle_comment(self, data): 
     self._target.start(ET.Comment, {}) 
     self._target.data(data) 
     self._target.end(ET.Comment) 

要使用此,創建該對象的實例作爲「分析器」,然後作爲參數傳遞給ElementTree.parse()之類這樣的:

parser = PCParser() 
self.tree = ET.parse(self.templateOut, parser=parser) 

我拿不出任何信用的代碼,或無證使用ElementTree的,但它僅保留意見,而不會影響原有的文檔結構爲我工作。並且請注意,對ElementTree的任何未來改變(儘管這些年來似乎不太可能)將打破這一點。

+0

我正在使用'lxml'並試圖讓它工作。我正在從lxml導入etree導入''et'。我想我可以用'et'替換'self._parser',但不知道要用什麼來代替'self._target'。你能幫我嗎? – eoinzy 2015-08-13 15:28:12