Warum löst ElementTree einen ParseError?

9

Ich habe versucht, eine Datei mit xml.etree.ElementTree zu analysieren:

%Vor%

Dies ist natürlich eine vereinfachte Version meines Codes, aber das ist genug, um mein Programm zu brechen. Ich bekomme diesen Fehler mit einigen Dateien, wenn ich den try-catch-Block entferne:

%Vor%

Die Ergebnisse sind jedoch deterministisch, wenn eine Datei funktioniert, wird sie immer funktionieren. Wenn eine Datei fehlschlägt, schlägt sie immer fehl und schlägt immer am selben Punkt fehl.

Das Seltsamste ist, dass ich den Trace benutze, um herauszufinden, ob ich einen fehlerhaften XML-Code habe, der den Parser zerstört. Ich isoliere dann den Knoten, der den Fehler verursacht hat. Aber wenn ich eine XML-Datei erstelle, die diesen Knoten und einige seiner Nachbarn enthält, funktioniert das Parsen!

Das scheint auch kein Größenproblem zu sein. Ich habe es geschafft, viel größere Dateien ohne Probleme zu analysieren.

Irgendwelche Ideen?

    
Aillyn 07.10.2011, 22:38
quelle

4 Antworten

7

Wie John Machin vorgeschlagen hat, enthalten die fraglichen Dateien zweifelhafte numerische Entitäten, obwohl die Fehlermeldungen scheinbar an der falschen Stelle im Text stehen. Vielleicht machen es die Streaming-Natur und die Pufferung schwierig, genaue Positionen zu melden.

Tatsächlich erscheinen alle diese Entitäten im Text:

%Vor%

Die meisten sind nicht erlaubt. Sieht so aus, als ob dieser Parser ziemlich streng ist, Sie müssen einen anderen finden, der nicht so streng ist, oder den XML-Code vorverarbeiten.

    
Ned Batchelder 08.10.2011, 03:32
quelle
8

Hier sind einige Ideen:

(0) Erkläre "eine Datei" und "gelegentlich": meinst du wirklich, dass es manchmal funktioniert und manchmal mit der selben Datei fehlschlägt?

Gehen Sie für jede fehlerhafte Datei wie folgt vor:

(1) Finden Sie heraus, was sich in der Datei an dem Punkt befindet, über den sie sich beschweren:

%Vor%

(2) Werfen Sie Ihre Datei auf einen webbasierten XML-Validierungsdienst, z. Ссылка oder Ссылка

und bearbeiten Sie Ihre Frage, um Ihre Ergebnisse anzuzeigen.

Update : Hier ist die minimale XML-Datei, die Ihr Problem veranschaulicht:

%Vor%

Nicht alle gültigen Unicode-Zeichen sind in XML gültig. Weitere Informationen finden Sie in der XML 1.0-Spezifikation .

Sie können Ihre Dateien mit Regexes wie r'&#([0-9]+);' und r'&#x([0-9A-Fa-f]+);' untersuchen, den übereinstimmenden Text in eine int-Ordinalzahl umwandeln und mit der gültigen Liste aus der Spezifikation vergleichen, z. B. #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

... oder die numerische Zeichenreferenz ist syntaktisch ungültig, z. nicht beendet durch ; ', &#not-a-digit etc etc

Update 2 Ich habe mich geirrt, die Zahl in der ElementTree-Fehlermeldung zählt Unicode-Codepunkte, keine Bytes. Sehen Sie sich den Code unten an und schnipsel aus der Ausgabe, um ihn über die zwei fehlerhaften Dateien auszuführen.

%Vor%

Ausgabe:

%Vor%     
John Machin 07.10.2011 23:43
quelle
3

Ich bin nicht sicher, ob das Ihre Frage beantwortet, aber wenn Sie eine Ausnahme mit dem ParseError verwenden möchten, das von der Elementstruktur ausgelöst wird, würden Sie dies tun:

%Vor%

Quelle: Ссылка

    
wsisaac 06.10.2014 05:00
quelle
0

Ich denke, es könnte auch wichtig sein, hier zu notieren, dass Sie Ihren Fehler eher leicht abfangen und vermeiden können, Ihr Programm vollständig zu stoppen, indem Sie einfach das verwenden, was Sie später bereits in der Funktion verwenden. p> %Vor%

in einem Versuch & amp; außer Klammer:

%Vor%

Natürlich wird dies Ihre XML-Datei oder Vorverarbeitungstechnik nicht beheben, aber könnte helfen, herauszufinden, welche Datei (wenn Sie Partien analysieren) Ihren Fehler verursacht.

    
ntk4 19.05.2016 18:14
quelle

Tags und Links