【问题标题】:Write over xml root, but keep header comment覆盖 xml 根目录,但保留标题注释
【发布时间】:2021-12-14 21:40:45
【问题描述】:

我有一个脚本设置为使用 Python 中的 lxml 库中的解析来读取 xml 文件,并提供了一些逻辑来删除指定的属性。我想覆盖 xml 元素,但保留标题注释。

Example.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Original Header
Some more info -->
<Foo Name = "Bar" Pet = "Able">
  <Foo2 Name = "Bar2" />
  <Foo3 Name = "Bar3" />
</Foo>

我想在完成处理逻辑后写回 xml 文件,使 Example.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<!-- Original Header
Some more info -->
<Foo Name = "Bar">
  <Foo2 Name = "Bar2" />
  <Foo3 Name = "Bar3" />
</Foo>

属性的移除是我已经想到的。写回同一个 xml 文件并保留标题是我想不出的解决方案。最坏的情况是我创建了一个输出文件夹并手动对文件执行 BeyondCompare,但我想完全自动化。

【问题讨论】:

标签: python python-3.x xml lxml


【解决方案1】:

您可以使用BeautifulSoup 使用lxml 解析器轻松完成此操作。首先,打开文件进行读取,使用BeautifulSoup解析内容,根据需要进行更改,然后打开文件进行写入并写入文件。

from bs4 import BeautifulSoup


with open('./Example.xml', 'r') as f:
    xml = f.read()
soup = BeautifulSoup(xml, 'lxml-xml')
foo = soup.find('Foo')
del foo['Pet']
with open('./Example.xml', 'w') as f:
    f.write(soup.prettify())

可以更简洁地写成:

from bs4 import BeautifulSoup


with open('./Example.xml', 'r') as f:
    soup = BeautifulSoup(f.read(), 'xml')
del soup.find('Foo')['Pet']
with open('./Example.xml', 'w') as f:
    f.write(soup.prettify())

【讨论】:

  • 我还假设您也可以使用 soup.find('Foo2')['OtherAttribute'] 从子元素中删除属性?
  • 是的,BeautifulSoup 非常强大,您可以添加、删除或更新任何元素、属性、评论或文本。请参阅crummy.com/software/BeautifulSoup/bs4/doc 上的文档
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多