XMLとしてフォーマットされたISMファイル(InstallShieldプロジェクト)を持っています。Python:xml.etree.ElementTreeがXMLフォーマットを破棄します
ファイルの属性を変更する必要があるため、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)
ありがとうです!
自己回答はSOに適しています。ありがとう。 – msw