gpt4 book ai didi

Python:xml.etree.ElementTree破坏xml格式

转载 作者:行者123 更新时间:2023-12-01 02:21:47 27 4
gpt4 key购买 nike

我有一个 XML 格式的 ISM 文件(InstallShield 项目)。

我需要更改文件中的一些属性,因此我使用了 xml.etree.ElementTree(Python 库)。

我可以找到这些值并更改它们,但是,在使用更新的值保存文件后,我无法在 InstallShield 中打开它(我收到一个无法打开文件的一般错误)。

当我将旧文件与新文件进行比较时,我发现除了我更改的值之外,新 XML 中还缺少一些行,并且在某些行中标记名称已更改。

为什么会发生这种情况?除了我所做的更改之外,还有什么可以使文件保持原样吗?我应该使用其他工具来进行更改吗?

例如,以下部分出现在原始 XML 中:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="is.xsl" ?>
<!DOCTYPE msi [
<!ELEMENT msi (summary,table*)>
<!ATTLIST msi version CDATA #REQUIRED>
<!ATTLIST msi xmlns:dt CDATA #IMPLIED
codepage CDATA #IMPLIED
compression (MSZIP|LZX|none) "LZX">

<!ELEMENT summary (codepage?,title?,subject?,author?,keywords?,comments?,
template,lastauthor?,revnumber,lastprinted?,
createdtm?,lastsavedtm?,pagecount,wordcount,
charcount?,appname?,security?)>

<!ELEMENT codepage (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT keywords (#PCDATA)>
<!ELEMENT comments (#PCDATA)>
<!ELEMENT template (#PCDATA)>
<!ELEMENT lastauthor (#PCDATA)>
<!ELEMENT revnumber (#PCDATA)>
<!ELEMENT lastprinted (#PCDATA)>
<!ELEMENT createdtm (#PCDATA)>
<!ELEMENT lastsavedtm (#PCDATA)>
<!ELEMENT pagecount (#PCDATA)>
<!ELEMENT wordcount (#PCDATA)>
<!ELEMENT charcount (#PCDATA)>
<!ELEMENT appname (#PCDATA)>
<!ELEMENT security (#PCDATA)>

<!ELEMENT table (col+,row*)>
<!ATTLIST table
name CDATA #REQUIRED>

<!ELEMENT col (#PCDATA)>
<!ATTLIST col
key (yes|no) #IMPLIED
def CDATA #IMPLIED>

<!ELEMENT row (td+)>

<!ELEMENT td (#PCDATA)>
<!ATTLIST td
href CDATA #IMPLIED
dt:dt (string|bin.base64) #IMPLIED
md5 CDATA #IMPLIED>
]>
<msi version="2.0" xmlns:dt="urn:schemas-microsoft-com:datatypes" codepage="65001">

但是在新的 XML 中它消失了,取而代之的是:

<msi xmlns:ns0="urn:schemas-microsoft-com:datatypes" codepage="65001" version="2.0">

还有更多差异,这只是一个例子。

我用来进行更改的Python代码是

   tree = Et.parse(ism_file_path)
root = tree.getroot()

for attributes_group in root:
for attribute in attributes_group:

if attribute.tag == "revnumber":

new_package_code = increment_hex_number(attribute.text)

attribute.text = new_package_code

tree.write(ism_file_path)

谢谢!

最佳答案

最终我搬到了一个新的库 - lxml。与 xml.etree.ElementTree 相反,这个库保留所有标签的顺序,所以我做了完全相同的事情并且它有效:

def modify_ism_file(ism_file_path):
context = etree.iterparse(ism_file_path)
for action, attributes_group in context:
for attribute in attributes_group:
if attribute.tag == "revnumber":
print "Found package code. TAG = {0} TEXT = {1}".format(attribute.tag, attribute.text)
new_package_code = increment_hex_number(attribute.text)
print "New package code is {0}".format(new_package_code)
attribute.text = new_package_code

obj_xml = etree.tostring(context.root, pretty_print=True, xml_declaration=True, encoding="utf-8")

with open(ism_file_path, "w") as f:
f.write(obj_xml)

关于Python:xml.etree.ElementTree破坏xml格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888784/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com