ElementTree を使用して XML ノードを追加できますが、XML ファイルをテキスト形式で開くと、同じようなツリー構造ではなく、1 行で出力が返されます。minidom.toprettyxml も使用してみましたが、元の XML に出力を追加する方法がわかりません。スクリプトを他の環境でも再現できるようにしたいので、lxml などの外部ライブラリは使用しない方がよいと思います。出力をきれいに印刷する方法を教えてください。- パイソン2.7
サンプル XML。これは、テキスト形式とエクスプローラーの両方でどのように見えるかです。
<?xml version="1.0" encoding="utf-8"?>
<default_locators >
<locator_ref>
<name>cherry</name>
<display_name>cherrycherry</display_name>
<workspace_properties>
<factory_progid>Workspace</factory_progid>
<path>InstallDir</path>
</workspace_properties>
</locator_ref>
</default_locators>
テキスト形式とエクスプローラーの両方で期待される出力。
<?xml version="1.0" encoding="utf-8"?>
<default_locators >
<locator_ref>
<name>cherry</name>
<display_name>cherrycherry</display_name>
<workspace_properties>
<factory_progid>Workspace</factory_progid>
<path>InstallDir</path>
</workspace_properties>
</locator_ref>
<locator_ref>
<name>berry</name>
<display_name>berryberry</display_name>
<workspace_properties>
<factory_progid>Workspace</factory_progid>
<path>C:\temp\temp</path>
</workspace_properties>
</locator_ref>
</default_locators>
私のスクリプト
#coding: cp932
import xml.etree.ElementTree as ET
tree = ET.parse(r"C:\DefaultLocators.xml")
root = tree.getroot()
locator_ref = ET.SubElement(root, "locator_ref")
name = ET.SubElement(locator_ref, "name")
name.text = " berry"
display_name = ET.SubElement(locator_ref, "display_name")
display_name.text = "berryberry"
workspace_properties = ET.SubElement(locator_ref, "workspace_properties")
factory_progid = ET.SubElement(workspace_properties,"factory_progid")
factory_progid.text = "Workspace"
path = ET.SubElement(workspace_properties, "path")
path.text = r"c:\temp\temp"
tree.write(r"C:\DefaultLocators.xml", encoding='utf-8')
返された出力。スクリプトを実行すると、新しいノードが sample.xml ファイルに追加されますが、元の sample.xml ファイルからすべての改行とインデントが削除された 1 行で出力が返されます。少なくとも、sample.xml ファイルをテキスト形式で開くと、このように表示されます。しかし、エクスプローラーで sample.xml ファイルを開くと、問題ないように見えます。改行とインデントは以前と同じように表示されます。スクリプトを実行した後でも、元のツリー構造をテキスト形式で保持するにはどうすればよいですか?
<default_locators>
<locator_ref>
<name>cherry</name>
<display_name>cherrycherry</display_name>
<workspace_properties>
<factory_progid>Workspace</factory_progid>
<path>InstallDir</path>
</workspace_properties>
</locator_ref>
<locator_ref><name> berry</name><display_name>berryberry</display_name><workspace_properties><factory_progid>Workspace</factory_progid><path>c:\temp\temp</path></workspace_properties></locator_ref></default_locators>