>为什么要修改?
>我该如何防止这种情况?例如我只是想在一个非常复杂的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现在具有较少的属性.
Why is it modified?
ElementTree将名称空间声明移动到根元素,并删除文档中实际未使用的名称空间.
为什么ElementTree会这样做?我不知道,但也许这是一种使实现更简单的方法.
How can I prevent this? e.g. I just want to replace specific tag or it’s value in a quite complex xml-file without loosing any other informations.
我认为没有办法阻止这种情况发生.这个问题之前已经提出过.这是两个非常相似的问题,没有答案:
> How do I parse and write XML using Python’s ElementTree without moving namespaces around?
> Keep Existing Namespaces when overwriting XML file with ElementTree and Python
我的建议是使用lxml而不是ElementTree.使用lxml,名称空间声明将保留在原始文件中的位置.
Line 1 is gone.
该行是XML声明.建议但不强制要求.
如果您始终需要XML声明,请在write()方法调用中使用xml_declaration = True.