python:在 xml 中追加新数据会覆盖现有数据
python : appending new data in xml is overring existing data
我想将整个标签添加到 xml,下面是我的 XML 格式。
<?xml version="1.0" encoding="UTF-8"?>
<ca st="true" name="XMLConfig">
<app>
<!--- I want to add entire commneted tag to XML . !
<ar ty="co" name="st">
<ly ty="pt">
<pt>value</pt>
</Layout>
</ar> -->
<roll name="roll" fN="file.log" fP="logs.gz">
<ly type="ptl">
<pt>value</pt>
</ly>
<po>
<!-- Comment /> -->
<si size="100 MB" />
<!-- Comment /> -->
</po>
<de fI="max" max="10"/>
</roll>
</app>
如上文件所示,我想在文件
中添加此标签
<ar ty="co" name="st">
<ly ty="pt">
<pt>value</pt>
</Layout>
</ar>
这是我到目前为止到达的地方..
for appenders in tree.xpath('//Appenders'):
if appenders.getchildren():
appenders.remove(appenders.getchildren()[0])
appenders.insert(0, appenders.getparent().append(etree.fromstring('<ar ty="co" name="st"> <ly ty="pt"><pt>value</pt></Layout></ar>')))
这将删除新内容之后的所有其他内容。
任何帮助将不胜感激。!
我成功了,!
for apps in tree.xpath('//app'):
if appenders.tag == 'app':
appenders.insert(0, etree.SubElement(appenders, 'ar', ty="Co", name="st"))
for appender in tree.xpath('//ar'):
appender.insert(0, etree.SubElement(appender, 'ly', ty="pt"))
for layout in tree.xpath('//ly'):
layout.insert(0, etree.SubElement(layout, 'pt'))
for pattern in tree.xpath('//pt'):
pattern.text = 'value'
tree.write(r'C:\value.xml', xml_declaration=True, encoding='UTF-8')
如果有人有更好的方法来做到这一点..请让我知道,以便我可以对此进行改进!
在我看来,您采用的第一种方法要好得多。您刚刚在 insert
行中犯了一些错误,应该是这样的:
appenders.insert(0, etree.fromstring('<ar ty="co" name="st"> <ly ty="pt"><pt>value</pt></ly></ar>')))
我很惊讶它没有为您抛出错误,因为您的插入行基本上是这样的:
appenders.insert(0,None)
我还注意到你在所有问题中都做了一些事情:
- 您遗漏了 xml 文件的某些行。 (我是说为什么?)
- 你缩短了你 xml 中的标签名称,但你在代码中保留了他们的长版本,这有点烦人,因为想要回答你的人必须再次更改代码以查看它是否正在工作。
我想将整个标签添加到 xml,下面是我的 XML 格式。
<?xml version="1.0" encoding="UTF-8"?>
<ca st="true" name="XMLConfig">
<app>
<!--- I want to add entire commneted tag to XML . !
<ar ty="co" name="st">
<ly ty="pt">
<pt>value</pt>
</Layout>
</ar> -->
<roll name="roll" fN="file.log" fP="logs.gz">
<ly type="ptl">
<pt>value</pt>
</ly>
<po>
<!-- Comment /> -->
<si size="100 MB" />
<!-- Comment /> -->
</po>
<de fI="max" max="10"/>
</roll>
</app>
如上文件所示,我想在文件
中添加此标签 <ar ty="co" name="st">
<ly ty="pt">
<pt>value</pt>
</Layout>
</ar>
这是我到目前为止到达的地方..
for appenders in tree.xpath('//Appenders'):
if appenders.getchildren():
appenders.remove(appenders.getchildren()[0])
appenders.insert(0, appenders.getparent().append(etree.fromstring('<ar ty="co" name="st"> <ly ty="pt"><pt>value</pt></Layout></ar>')))
这将删除新内容之后的所有其他内容。 任何帮助将不胜感激。!
我成功了,!
for apps in tree.xpath('//app'):
if appenders.tag == 'app':
appenders.insert(0, etree.SubElement(appenders, 'ar', ty="Co", name="st"))
for appender in tree.xpath('//ar'):
appender.insert(0, etree.SubElement(appender, 'ly', ty="pt"))
for layout in tree.xpath('//ly'):
layout.insert(0, etree.SubElement(layout, 'pt'))
for pattern in tree.xpath('//pt'):
pattern.text = 'value'
tree.write(r'C:\value.xml', xml_declaration=True, encoding='UTF-8')
如果有人有更好的方法来做到这一点..请让我知道,以便我可以对此进行改进!
在我看来,您采用的第一种方法要好得多。您刚刚在 insert
行中犯了一些错误,应该是这样的:
appenders.insert(0, etree.fromstring('<ar ty="co" name="st"> <ly ty="pt"><pt>value</pt></ly></ar>')))
我很惊讶它没有为您抛出错误,因为您的插入行基本上是这样的:
appenders.insert(0,None)
我还注意到你在所有问题中都做了一些事情:
- 您遗漏了 xml 文件的某些行。 (我是说为什么?)
- 你缩短了你 xml 中的标签名称,但你在代码中保留了他们的长版本,这有点烦人,因为想要回答你的人必须再次更改代码以查看它是否正在工作。