1

我需要添加一个新标签并写回 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"

我能够用 etree 完成任务。

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 文件中。加评论。我也发现评论不见了。

4

2 回答 2

0

ElementTree的文档清楚地表明这是不可能的:

注意:并非 XML 输入的所有元素最终都会成为解析树的元素。目前,此模块跳过输入中的任何 XML 注释、处理指令和文档类型声明

对我来说开箱即用的是minidom。除非文档非常大,否则您可以将其保存在内存中

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)
于 2020-10-20T21:42:56.243 回答
-1

正如OP所建议的,这里的(或解决方案是使用lxml,如下所示,它将保留注释和处理指令:

import lxml.etree as ET
tree = ET.parse(filename)
于 2019-08-02T13:53:15.600 回答