如何保持意见,同时解析使用Python/XML ElementTree的

问题描述:

目前使用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

我知道这已经很老了,但我偶然发现了上面有关如何保留评论的答案。 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