我在python中编写了一个相当简单的过滤器,使用ElementTree来处理某些xml文件的上下文.它或多或少都有效.
但它重新排序各种标签的属性,我希望它不会那样做.
有没有人知道我可以抛出一个开关使它按指定顺序保持?
我正在使用粒子物理工具,它具有基于xml文件的复杂但奇怪的有限配置系统.在许多方面,设置方式是各种静态数据文件的路径.这些路径硬编码到现有的xml中,并且没有用于根据环境变量设置或更改它们的工具,在我们的本地安装中,它们必须位于不同的位置.
这不是灾难,因为我们使用的组合源和构建控制工具允许我们使用本地副本隐藏某些文件.但是,即使数据字段是静态的,xml也不是,所以我编写了一个用于修复路径的脚本,但是在本地版本和主版本之间的属性重新排列差异比必要时更难阅读.
这是我第一次使用ElementTree旋转(只有我的第五或第六个python项目),所以也许我只是做错了.
为简单起见,代码看起来像这样:
tree = elementtree.ElementTree.parse(inputfile)
i = tree.getiterator()
for e in i:
e.text = filter(e.text)
tree.write(outputfile)
Run Code Online (Sandbox Code Playgroud)
合理还是愚蠢?
相关链接:
我正在使用python的lxml,我正在尝试读取xml文档,修改并将其写回,但原始的doctype和xml声明消失了.我想知道是否有一种简单的方法可以通过lxml或其他解决方案将其放回去?
目前使用的是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.
我有一个xml我正在解析,进行一些更改并保存到一个新文件.它有<?xml version="1.0" encoding="utf-8" standalone="yes"?>我想保留的声明.当我保存我的新文件时,我失去了standalone="yes"一点.我该如何保管?这是我的代码:
templateXml = """<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<package>
<provider>Some Data</provider>
<studio_display_name>Some Other Data</studio_display_name>
</package>"""
from lxml import etree
tree = etree.fromstring(templateXml)
xmlFileOut = '/Users/User1/Desktop/Python/Done.xml'
with open(xmlFileOut, "w") as f:
f.write(etree.tostring(tree, pretty_print = True, xml_declaration = True, encoding='UTF-8'))
Run Code Online (Sandbox Code Playgroud) 我可以使用“import xml.etree.ElementTree as et”读取 xml 文件。但我的问题是读取数据文件中给出的注释文本,如何读取:例如在下面的 xml 中,我想读取BaseVehicle是1997 Cadillac Catera
<App action="A" id="1">
<BaseVehicle id="8559"/>
<!-- 1997 Cadillac Catera -->
<Qty>1</Qty>
<PartType id="4472"/>
<!-- Electrical/Headlight/Switch -->
<Part>SW1406</Part>
</App>
Run Code Online (Sandbox Code Playgroud)