2017-08-31 59 views
4

我使用Python3.5中的xml讀取編寫一個xml文件。我不修改該文件。只需打開並寫入。但是庫修改了文件。爲什麼xml包在Python3中修改我的xml文件?

  1. 爲什麼修改?
  2. 我該如何預防?例如我只想在一個非常複雜的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號線走了。
  • <movie> - 第2行中的標籤現在有屬性。
  • 第7行和第11行中的<value> -tag現在具有較少的屬性。
+1

通常,XML命名空間的短名稱(以及它們在哪裏指定)不能期望是穩定的。但是爲什麼你不使用'lxml'呢? – o11c

+1

'lxml'默認情況下保留了命名空間,儘管您仍然必須通過一個標誌才能將XML聲明置頂。 – o11c

+0

@ o11c你的意思是一個python包'lxml'?我沒有注意到它。我只是在Python文檔中使用'xml'作爲搜索詞,並找到了'ElementTree'。 – buhtz

回答

3

請注意,「xml包」和「xml庫」是不明確的。標準庫中有幾個與XML相關的模塊:https://docs.python.org/3/library/xml.html

爲什麼修改?

ElementTree將名稱空間聲明移動到根元素,並且文檔中實際未使用的名稱空間被刪除。

爲什麼ElementTree會這樣做?我不知道,但也許這是一種簡化實現的方法。

我該如何預防?例如我只想在一個非常複雜的xml文件中替換特定標籤或其值,而不會丟失任何其他信息。

我不認爲有一種方法可以防止這種情況發生。這個問題已經提出過。這裏是沒有答案兩個非常相似的問題:

我的建議是使用lxml代替的ElementTree。使用lxml,名稱空間聲明將保留在原始文件中出現的位置。

1號線不見了。

該行是XML聲明。建議但不是強制性的。

如果您始終需要XML聲明,請在write()方法調用中使用xml_declaration=True