Сохранение XML-комментариев и инструкций по обработке перед корневым элементом
Мне нужно добавить новый тег и написать обратно в XML. Вот мой XML-файл.
<?xml version="1.0" encoding="UTF-8"?>
<!--Arbortext, Inc., 1988-2011, v.4002-->
<!DOCTYPE reference-configuration-statement PUBLIC "-//Juniper Networks//DTD Jbook Software Guide//EN"
"file:////cmsxml/IWServer/default/main/TechPubsWorkInProgress/STAGING/bin/dtds/jbook-sw/jbook-sw.dtd">
<?Pub UDT _nopagebreak _touchup KeepsKeep="yes" KeepsPrev="no" KeepsNext="no" KeepsBoundary="page"?>
<?Pub UDT _bookmark _target?>
<?Pub UDT instructions _comment FontColor="red"?>
<?Pub UDT instructions-DUPLICATE1 _comment FontColor="red"?>
<?Pub UDT __target_1 _target?>
<?Pub UDT __target_3 _target?>
<?Pub UDT __target_2 _target?>
<?Pub UDT _bookmark-DUPLICATE1 _target?>
<?Pub UDT __target_4 _target?>
<?Pub EntList copy trade micro reg plusmn deg middot mdash ndash nbsp
caret cent check acute frac12 frac13 frac14 frac15 frac16 frac18 frac23
frac25 frac34 frac35 frac38 frac45 frac56 frac58 frac78 ohm pi sup sup1
sup2 sup3 rsquo?>
<?Pub Inc?>
<root topic-id="25775"
Умею выполнить задачу с помощью этри.
path="C:/Users/pshahul/Desktop/Official/Automation/Write_XMl_files/Source/"
add=(path, Filename)
myfile=s.join(add)
try:
et = xml.etree.ElementTree.parse(myfile)
tree=etree.parse(myfile)
docinfo=tree.docinfo.encoding
root=et.getroot()
elem = root.find('cli-help')
if elem is None:
new_tag=ET.Element("cli-help")
new_tag.text=final
root.insert(2,new_tag)
et.write(myfile,encoding=docinfo, xml_declaration=True)
else:
elem.text=final
et.write(myfile,encoding=docinfo, xml_declaration=True)
except OSError:
pass
else:
raise TypeError
except TypeError:
continue
Теперь я получил объявление DOCTYPE и XML, но следующее пропускается.
<!--Arbortext, Inc., 1988-2011, v.4002-->
<?Pub UDT _nopagebreak _touchup KeepsKeep="yes" KeepsPrev="no" KeepsNext="no" KeepsBoundary="page"?>
<?Pub UDT _bookmark _target?>
<?Pub UDT instructions _comment FontColor="red"?>
<?Pub UDT instructions-DUPLICATE1 _comment FontColor="red"?>
<?Pub UDT __target_1 _target?>
<?Pub UDT __target_3 _target?>
<?Pub UDT __target_2 _target?>
<?Pub UDT _bookmark-DUPLICATE1 _target?>
<?Pub UDT __target_4 _target?>
<?Pub EntList copy trade micro reg plusmn deg middot mdash ndash nbsp
caret cent check acute frac12 frac13 frac14 frac15 frac16 frac18 frac23
frac25 frac34 frac35 frac38 frac45 frac56 frac58 frac78 ohm pi sup sup1
sup2 sup3 rsquo?>
<?Pub Inc?>
Как мне сохранить это? Мне нужны эти строки обратно в мой файл XML. Плюс комментарии. Я тоже нахожу комментарии отсутствующими.
0 ответов
В документации ElementTree ясно сказано, что это невозможно:
Примечание. Не все элементы входных XML-данных окажутся элементами анализируемого дерева. В настоящее время этот модуль пропускает любые XML-комментарии, инструкции по обработке и объявления типов документов во входных данных.
То, что у меня сработало из коробки, было минидомом. Если документ не очень большой, его можно хранить в памяти.
from xml.dom import minidom
from xml.dom import Node
xml_string = "<?xml version='1.0'?><!--comment--><root><!--inside comment--><child/></root>"
xml_doc = minidom.parseString(xml_string)
for node in xml_doc.getchildNodes:
if node.nodeType == Node.COMMENT_NODE:
print("Comment", node.data)
Как было предложено ОП, то (или) решением здесь является использование LXML следующим образом, который будет сохранять комментарии, а также инструкции обработки:
import lxml.etree as ET
tree = ET.parse(filename)