2016-08-09 43 views
8

試圖解析XML文件轉換成ElementTree的:Python的XML:ParseError:文檔元素後的垃圾

>>> import xml.etree.cElementTree as ET 
>>> tree = ET.ElementTree(file='D:\Temp\Slikvideo\JPEG\SV_4_1_mask\index.xml') 

我獲得以下錯誤:

Traceback (most recent call last): File "", line 1, in File "C:\Program Files\Anaconda2\lib\xml\etree\ElementTree.py", line 611, in init self.parse(file) File "", line 38, in parse ParseError: junk after document element: line 3, column 0

XML文件開始是這樣的:

<?xml version="1.0" encoding="UTF-8" ?> 
<Version Writer="E:\d\src\Modules\SceneSerialization\src\mitkSceneIO.cpp" Revision="$Revision: 17055 $" FileVersion="1" /> 
<node UID="OBJECT_2016080819041580480127"> 
    <source UID="OBJECT_2016080819041550469454" /> 
    <data type="LabelSetImage" file="hfbaaa_Bolus.nrrd" /> 
    <properties file="sicaaa" /> 
</node> 
<node UID="OBJECT_2016080819041512769572"> 
    <source UID="OBJECT_2016080819041598947781" /> 
    <data type="LabelSetImage" file="ifbaaa_Bolus.nrrd" /> 
    <properties file="ticaaa" /> 
</node> 

其次是更多的節點。

我沒有看到第3行第0列有任何垃圾?我認爲這個錯誤肯定還有其他原因。

.xml文件由外部軟件MITK生成,所以我認爲應該沒問題。

在Win 7中,64位,VS2015,阿納康達

+0

XML格式不正確。沒有包含所有其他元素的根元素。 –

+0

與這個問題無關,您應該考慮轉義Windows路徑字符串文本(「... \\ ...」)或使用原始字符串(r「... \ ...」)。 –

+0

@Martin:謝謝,同意。在代碼的其他部分完成。 – jdelange

回答

8

正如@Matthias Wiehl所說,ElementTree只需要一個根節點,它不是格式良好的XML,應該在其原點上進行修復。 作爲解決方法,您可以簡單地向文檔添加假根節點。

import xml.etree.cElementTree as ET 
import re 

with open("index.xml") as f: 
    xml = f.read() 
tree = ET.fromstring(re.sub(r"(<\?xml[^>]+\?>)", r"\1<root>", xml) + "</root>") 
+0

馬丁,這是一個優雅的修復。這在導入etree.ElementTree時起作用,如果我使用cEmelentTree,我會在類型的cElementTree.py un(淺)可複製對象中出錯。我需要弄清楚爲什麼。 – jdelange

2

文檔的根節點(Version)工作被打開關閉第2行解析器不期望根節點之後的任何節點。解決方案是刪除正斜槓。

+1

假設我需要解析這個文件(我無法生成不同的格式),那麼快速修復會是什麼?複製文件並創建一個格式正確的虛擬文件,然後解析它?我應該改變什麼?我應該在文檔的末尾放置正斜槓嗎? – jdelange

+0

正如指出的那樣,文檔格式不正確。生成它的軟件已損壞。你應該提交一個錯誤報告。 –

0

請嘗試修復此文檔。在末尾關閉version元素

<?xml version="1.0" encoding="UTF-8" ?> 
<Version Writer="E:\d\src\Modules\SceneSerialization\src\mitkSceneIO.cpp" Revision="$Revision: 17055 $" FileVersion="1"> 
    <node UID="OBJECT_2016080819041580480127"> 
     <source UID="OBJECT_2016080819041550469454" /> 
     <data type="LabelSetImage" file="hfbaaa_Bolus.nrrd" /> 
     <properties file="sicaaa" /> 
    </node> 
    <node UID="OBJECT_2016080819041512769572"> 
     <source UID="OBJECT_2016080819041598947781" /> 
     <data type="LabelSetImage" file="ifbaaa_Bolus.nrrd" /> 
     <properties file="ticaaa" /> 
    </node> 
</Version> 
+0

這也適用於測試。 – jdelange

相關問題