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

Posted

技术标签:

【中文标题】Python 如何在使用 Python 写入新值后保持 XML 注释存在?【英文标题】:Python how to keep the XML comment exist after write a new value using Python? 【发布时间】:2021-06-14 10:06:35 【问题描述】:

我有一个 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 文件的输出变成这个。评论和&lt;?xml version="1.0" encoding="UTF-8"?&gt;消失了。

<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>

任何人都可以帮助我,拜托。非常感谢。

【问题讨论】:

【参考方案1】:
    使用ET.XMLParser 保存cmets 在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)

【讨论】:

你能帮我检查一下这个帖子***.com/q/66671021/11076819吗。抱歉打扰你。非常感谢:)

以上是关于Python 如何在使用 Python 写入新值后保持 XML 注释存在?的主要内容,如果未能解决你的问题,请参考以下文章

Room - 插入新值后执行删除

Python Pandas - 如何在 Excel 工作表的特定列中写入

如何在python中使用多处理为变量赋值新值

如何使用 Python 在给定列中插入新值? [复制]

如何使用 statsmodels.formula.api (python) 预测新值

从 Arduino 将新数据写入 Python 中的 csv 文件