Python XML: ParseError: мусор после элемента документа

Попытка разобрать файл XML в ElementTree:

>>> 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 "<stdin>", line 1, in <module>
  File "C:\Program Files\Anaconda2\lib\xml\etree\ElementTree.py", line 611, in __init__
    self.parse(file)
  File "<string>", 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, Anaconda

Ответ 1

Как сказал @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>")

Ответ 2

Корень node вашего документа (Version) открыт и закрыт в строке 2. Парсер не ожидает ни одного узла после корня node. Решение состоит в том, чтобы удалить закрытие косой черты.

Ответ 3

Попробуйте восстановить этот документ. Закройте элемент 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>