Python如何在使用Python编写新值后保持XML注释的存在?

2024-10-03 23:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个XML文件,然后需要更新一些值。我的XML文件包含注释。我想在编写XML后保留注释,但它消失了

以下是我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Data System -->
<process>
     <!-- Student Name -->
     <NAME source="hsfg" class="hshah" property="Name">
          <VALUE type="string"></VALUE>
          <VALUE type="None"></VALUE>
     </NAME>
     <!-- Exercise Number -->
     <number source="hsfg" class="hgdgf" property="gagfa">
          <VALUE type="string"></VALUE>
          <VALUE type="None"></VALUE>
     </number>
     <!-- Exam ID -->
     <id source="hsfg" class="gfdg" property="fadg">
          <VALUE type="string"></VALUE>
          <VALUE type="None"></VALUE>
     </id>
</process>

这是我需要更新的值

<!-- Student Name -->
     <NAME source="hsfg" class="hshah" property="Name">
          <VALUE type="string"></VALUE>
          <VALUE type="None"></VALUE>
     </NAME>

变成这样:

<!-- Student Name -->
     <NAME source="hsfg" class="hshah" property="Name">
          <VALUE type="string">new value</VALUE>
          <VALUE type="None"></VALUE>
     </NAME>

我的代码:

read = ET.parse('test.xml').getroot()
parent = read.find('.//NAME[@property="Name"]')
change = parent.find('VALUE[@type="string"]')
change.text = 'new value'
tree = ET.ElementTree(read)
tree.write("test.xml")

test.xml文件的输出如下所示。注释和<?xml version="1.0" encoding="UTF-8"?>消失了

<process>
     
     <NAME source="hsfg" class="hshah" property="Name">
          <VALUE type="string">new value</VALUE>
          <VALUE type="None" />
     </NAME>
     
     <number source="hsfg" class="hgdgf" property="gagfa">
          <VALUE type="string" />
          <VALUE type="None" />
     </number>
     
     <id source="hsfg" class="gfdg" property="fadg">
          <VALUE type="string" />
          <VALUE type="None" />
     </id>
</process>

但我的期望输出、结构和注释仍与之前相同,更新值如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Data System -->
<process>
     <!-- Student Name -->
     <NAME source="hsfg" class="hshah" property="Name">
          <VALUE type="string">new value</VALUE>
          <VALUE type="None"></VALUE>
     </NAME>
     <!-- Exercise Number -->
     <number source="hsfg" class="hgdgf" property="gagfa">
          <VALUE type="string"></VALUE>
          <VALUE type="None"></VALUE>
     </number>
     <!-- Exam ID -->
     <id source="hsfg" class="gfdg" property="fadg">
          <VALUE type="string"></VALUE>
          <VALUE type="None"></VALUE>
     </id>
</process>

任何人都可以帮助我。非常感谢你


Tags: namenoneidnumbersourcestringvaluetype
1条回答
网友
1楼 · 发布于 2024-10-03 23:18:44
  1. 使用ET.XMLParser保留注释
  2. write()函数中使用encodingxml_declaration参数来编写xml声明 请尝试以下代码:
import xml.etree.ElementTree as ET
parser = ET.XMLParser(target=ET.TreeBuilder(insert_comments=True))

read = ET.parse('newXml.xml', parser=parser).getroot()
parent = read.find('.//NAME[@property="Name"]')
change = parent.find('VALUE[@type="string"]')
change.text = 'new value'
tree = ET.ElementTree(read)
tree.write("test.xml", encoding='utf-8', xml_declaration=True)

您也可以避免变量read,只需使用tree

import xml.etree.ElementTree as ET
parser = ET.XMLParser(target=ET.TreeBuilder(insert_comments=True))

tree = ET.parse('newXml.xml', parser=parser)
parent = tree.find('.//NAME[@property="Name"]')
change = parent.find('VALUE[@type="string"]')
change.text = 'new value'
tree.write("test.xml", encoding='utf-8', xml_declaration=True)

相关问题 更多 >