如何在使用python编写XML文件时保留XML版本和注释?

2024-04-19 18:55:46 发布

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

我必须在运行时使用Python在XML文件上添加1个元素。 我的原始XML文件包含如下内容

<?xml version='1.0' encoding='utf-8'?>
<!--
  Some comments.
-->
<rootTag>
  <childTag className="org.Tiger" SSLEngine="on" />
  <childTag name="serv1">

    <Connector port="8001" SSLEnabled="true"
               maxThreads="800"
                                        URIEncoding="UTF-8"
               clientAuth="false" />
    <Track name="Pacific" defaultHost="localhost">
      <Realm className="Realm" appName="kernel"
             userClassNames="User"
             roleClassNames="Role"/>
      <Host name="localhost"
            createDirs="false">
        <Value className="Remote"
               httpsServerPort="223" />
      </Host>
    </Track>
  </childTag>
</rootTag>

下面是我为在运行时添加(Value)元素而编写的代码

import xml.etree.ElementTree as ET
myTree = ET.parse("new2.xml")
myRoot = myTree.getroot()

x = myTree.findall('.//Valve[@className="Error"]')
print(len(x))
if int(len(x)) == 0:
    for a in myRoot.findall('childTag'):
        for b in a.findall('Track'):
            for c in b.findall('Host'):
                ele = ET.Element('Value')
                ele.set("className", "Error")
                ele.set("showReport", "false")
                ele.set("showServerInfo", "false")
                c.append(ele)
                myTree.write("new2.xml")

我得到的结果是:

<rootTag>
  <childTag className="org.Tiger" SSLEngine="on" />
  <childTag name="serv1">

    <Connector port="8001" SSLEnabled="true" maxThreads="800" URIEncoding="UTF-8" clientAuth="false" />
    <Track name="Pacific" defaultHost="localhost">
      <Realm className="Realm" appName="kernel" userClassNames="User" roleClassNames="Role" />
      <Host name="localhost" autoDeploy="false" createDirs="false">
        <Value className="Remote" httpsServerPort="223" />
      <Value className="Error" showReport="false" showServerInfo="false" /></Host>
    </Track>
  </childTag>
</rootTag>

这里的问题是,它从文件中删除了XML版本、注释,并且 更改文件的缩进 如何只添加具有正确缩进的子元素而不更改文件中的任何其他内容 ?

O/p应该是这样的

<?xml version='1.0' encoding='utf-8'?>
<!--
  Some comments.
-->
<rootTag>
  <childTag className="org.Tiger" SSLEngine="on" />
  <childTag name="serv1">

    <Connector port="8001" SSLEnabled="true"
               maxThreads="800"
                                        URIEncoding="UTF-8"
               clientAuth="false" />
    <Track name="Pacific" defaultHost="localhost">
      <Realm className="Realm" appName="kernel"
             userClassNames="User"
             roleClassNames="Role"/>
      <Host name="localhost"
            createDirs="false">
        <Value className="Remote"
               httpsServerPort="223" />
        <Value className="Error"
               showReport="false" showServerInfo="false" />
      </Host>
    </Track>
  </childTag>
</rootTag>

Tags: 文件namefalselocalhosthostvaluetrackxml