我解析了太大的XML。當一個節點發生故障時,我想繼續循環,並用剩餘的節點做些事情。用無效節點解析XML
版本1
for event, element in etree.iterparse(file):
if element.tag == "tag1":
# Doing some stuff
與第一個版本,我得到一個例外:
ParseError: not well-formed (invalid token): line 319851
所以爲了處理保持節點我已經寫了第二個版本:
版本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
在這種情況下腳本進入無限循環。
於是,我去具體開行作爲一個文本文件:
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
我得到:
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>
所以似乎是行用「\ n」個板缺。這是一個XML錯誤,但爲什麼我的第二個版本不起作用?在我的第二個版本中,行319850和319851作爲XML無效,所以應該傳遞並獲取下一個節點/行。
我在這裏做錯了什麼? 如果你有最好的方法,請讓我知道。
UPDATE
XML文件具有無效字符 '\ X0B'。所以看起來像:
<tag1> <tag11><![CDATA[ foo bar '\x0b']]></tag11></tag1>
<tag1> <tag11><![CDATA[ foo bar]]></tag11></tag1>
<tag1> <tag11><![CDATA[ foo bar]]></tag11></tag1>
CDATA節中的換行符不是XML錯誤。我們如何重現這一點? – mzjn
@mzjn請參閱我的更新 –
例如,請參閱http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space。 –