【发布时间】:2018-02-09 23:01:29
【问题描述】:
我使用 Python3.5 中的 xml 库来读取和写入一个 xml 文件。我不修改文件。只需打开并写入。但是库会修改文件。
- 为什么要修改?
- 如何防止这种情况发生?例如我只是想在一个相当复杂的 xml 文件中替换特定标签或它的值,而不会丢失任何其他信息。
这是示例文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<movie>
<title>Der Eisbär</title>
<ids>
<entry>
<key>tmdb</key>
<value xsi:type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">9321</value>
</entry>
<entry>
<key>imdb</key>
<value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">tt0167132</value>
</entry>
</ids>
</movie>
这是代码
import xml.etree.ElementTree as ET
tree = ET.parse('x.nfo')
tree.write('y.nfo', encoding='utf-8')
xml文件变成了这个
<movie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<title>Der Eisbär</title>
<ids>
<entry>
<key>tmdb</key>
<value xsi:type="xs:int">9321</value>
</entry>
<entry>
<key>imdb</key>
<value xsi:type="xs:string">tt0167132</value>
</entry>
</ids>
</movie>
- 第 1 行不见了。
- 第 2 行中的
<movie>-tag 现在具有属性。 - 第 7 行和第 11 行中的
<value>-tag 现在具有更少的属性。
【问题讨论】:
-
一般来说,不能期望 XML 命名空间的短名称(以及指定它们的位置)是稳定的。但是你为什么不使用
lxml呢? -
lxml在默认情况下设法保留命名空间,尽管您仍然需要传递一个标志才能将 XML 声明置于顶部。 -
@o11c 你的意思是一个python包
lxml?我没注意到。我只是在 python 文档中使用xml作为搜索词,然后找到了ElementTree。 -
@o11c
lxml也无济于事。它也会对代码进行一些转换。 -
好吧,nobody 试图保留属性顺序。所以
lxml所做的就是对它们进行排序。因此,即使它们在第一次写入时发生更改,它们在所有后续写入中都会保持一致。
标签: xml python-3.x elementtree