2016-08-09 251 views
8

Der Versuch, XML-Datei in ElementTree zu analysieren:Python XML: ParseError: junk nach Dokumentelement

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

ich folgende Fehlermeldung erhalten:

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-Datei wie folgt beginnt:

<?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> 

gefolgt von vielen weiteren Knoten.

Ich sehe keinen Müll in Zeile 3, Spalte 0? Ich nehme an, dass es einen anderen Grund für den Fehler geben muss.

Die XML-Datei wird von externer Software MITK generiert, also nehme ich an, dass sollte in Ordnung sein.

Arbeiten auf Win 7, 64-Bit, VS2015, Anaconda

+0

Das XML ist nicht gut gebildet. Es gibt kein Root-Element, das alle anderen Elemente enthält. –

+0

Unabhängig von der Frage sollten Sie entweder das Windows-Pfadzeichenfolgeliteral ("... \\ ...") umgehen oder rohe Zeichenfolgen (r "... \ ...") verwenden. –

+0

@Martin: danke, einverstanden. Geschehen in anderen Teilen des Codes. – jdelange

Antwort

8

Wie @Matthias Wiehl sagte, erwartet ElementTree nur einen einzigen Wurzelknoten und ist kein wohlgeformtes XML und sollte an seinem Ursprung festgelegt werden. Als Workaround können Sie einfach einen falschen Stammknoten zum Dokument hinzufügen.

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

Martin, das ist eine elegante Lösung. Dies funktioniert beim Importieren von etree.ElementTree, wenn ich den cEmelentTree benutze, erhalte ich einen Fehler in cElementTree.py un (flaches) kopierbares Objekt vom Typ . Ich muss herausfinden, warum. – jdelange

2

Der Wurzelknoten des Dokuments (Version) ist geöffnet und geschlossen auf Linie 2. Der Parser erwartet keine Knoten nach dem Root-Knoten. Lösung ist, den schließenden Schrägstrich zu entfernen.

+1

Angenommen, ich muss diese Datei parsen (ich kann kein anderes Format erzeugen), was wäre eine schnelle Lösung? Kopieren Sie die Datei und erstellen Sie einen Dummy, der richtig formatiert ist, und parsen Sie das dann? Was soll ich ändern? Sollte ich den schließenden Schrägstrich am Ende des Dokuments setzen? – jdelange

+0

Wie richtig angemerkt wurde, ist das Dokument nicht wohlgeformt. Die Software, die es erzeugt hat, ist kaputt. Sie sollten einen Fehlerbericht einreichen. –

0

Versuchen Sie das Dokument so zu reparieren. Schließen Sie das version Element am Ende

<?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

Das funktioniert auch, also ist es gut zum Testen. – jdelange