如何保持意见,同时解析使用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进行格式化。
我知道这已经很老了,但我偶然发现了上面有关如何保留评论的答案。 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的任何未来改变(尽管这些年来似乎不太可能)将打破这一点。
我正在使用'lxml'并试图让它工作。我正在从lxml导入etree导入''et'。我想我可以用'et'替换'self._parser',但不知道要用什么来代替'self._target'。你能帮我吗? – eoinzy 2015-08-13 15:28:12
2.4?我的同情心。 – delnan 2010-12-17 21:08:34
你打赌,我开始创建我的第一个脚本意识到,我发现很好的东西,我发现的例子是2.7 :-) – rhellem 2010-12-17 21:13:16