Python, как сохранить комментарий XML после записи нового значения с помощью 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>

Кто-нибудь может мне помочь, пожалуйста. Большое спасибо.


person Cheries    schedule 17.03.2021    source источник


Ответы (1)


  1. Используйте ET.XMLParser, чтобы сохранить комментарии
  2. Используйте аргументы encoding и xml_declaration в функции write() для написания объявления 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)
person Abhi_J    schedule 17.03.2021
comment
Не могли бы вы помочь мне проверить и этот пост stackoverflow.com/q/66671021/11076819. Извините, что беспокою вас. Большое спасибо :) - person Cheries; 17.03.2021