rhe*_*lem 11 python xml elementtree
目前使用的是Python 2.4.3,不允许升级
我想在一个或多个标签中更改给定属性的值,以及更新文件中的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
Run Code Online (Sandbox Code Playgroud)
这很好,属性"initialState"被更新,除了我的原始XML包含很多XML注释的事实,但它们早已不复存在,这很糟糕.
怀疑解析只检索XML结构,但我认为XML-comments是结构的一部分.我也意识到我的原始文档的"人类可读"格式早已不复存在,但我已经意识到预期的行为,需要使用xmllint --format后续格式化或XSL.
Jon*_*son 17
我知道现在已经老了,但我偶然发现了上面关于如何保留评论的答案.Frederik 发布的有关如何将注释放入树中的说明仍然适用于当前版本的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)
Run Code Online (Sandbox Code Playgroud)
要使用它,请将此对象的实例创建为"解析器",然后将其作为参数传递给ElementTree.parse(),如下所示:
parser = PCParser()
self.tree = ET.parse(self.templateOut, parser=parser)
Run Code Online (Sandbox Code Playgroud)
我对代码或ElementTree的无证使用没有任何信任,但它对我来说只保留注释而不影响原始文档结构.请注意,对ElementTree的任何未来更改(尽管这些年后似乎不太可能)将打破这一点.
| 归档时间: |
|
| 查看次数: |
11453 次 |
| 最近记录: |