2016-08-09 42 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

相关问题