Ich habe zu große XML zu analysieren. Wenn ein Knoten ausfällt, möchte ich weiterlaufen und mit den verbleibenden Knoten arbeiten.Parsing XML mit ungültigen Knoten
Version 1
for event, element in etree.iterparse(file):
if element.tag == "tag1":
# Doing some stuff
mit der ersten Version erhalte ich eine Ausnahme:
ParseError: not well-formed (invalid token): line 319851
So um die bleiben Knoten I eine zweite Version geschrieben haben zu verarbeiten:
Version 2
xml_parser = etree.iterparse(file)
while True:
try:
event, element = next(xml_parser)
if element.tag == "tag1":
# Doing some stuff
# If there is no more elements to iterate, breaks the loop
except StopIteration:
break
# While another exception, keep looping
except Exception as e:
pass
In diesem Fall das Skript in eine Endlosschleife eingeben.
So versuchte ich, als Textdatei auf die spezifische Linie Öffnung gehen:
with open(file) as fp:
for i, line in enumerate(fp):
if i == 319850:
print(319850, line)
if i == 319851:
print(319851, line)
if i == 319852:
print(319852, line)
if i == 319853:
print(319853, line)
break
ich:
319850 <tag1> <tag11><![CDATA[ foo bar
319851 ]]></tag11></tag1>
319852 <tag1> <tag11><![CDATA[ foo bar]]></tag11></tag1>
319853 <tag1> <tag11><![CDATA[ foo bar]]></tag11></tag1>
scheint so, dass Linie zu sein, wird durch "\ n" zerschnitt. Das ist ein XML-Fehler, aber warum funktioniert meine zweite Version nicht? In meiner zweiten Version sind die Zeilen 319850 und 319851 nicht als XML gültig, daher sollten die nächsten Knoten/Zeilen übergeben werden.
Was mache ich hier falsch? Wenn Sie einen besten Ansatz haben, lassen Sie es mich wissen.
UPDATE
XML-Datei hat ein ungültiges Zeichen '\ X0B'. So sieht so aus:
<tag1> <tag11><![CDATA[ foo bar '\x0b']]></tag11></tag1>
<tag1> <tag11><![CDATA[ foo bar]]></tag11></tag1>
<tag1> <tag11><![CDATA[ foo bar]]></tag11></tag1>
Ein Zeilenumbruch in einem CDATA-Abschnitt ist kein XML-Fehler. Wie können wir das reproduzieren? – mzjn
@mzjn bitte, siehe mein Update –
Siehe http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space zum Beispiel. –