2013-09-09 2 views
0

Я использую lxml для разбора некоторых xml-файлов. Я их не создаю, я просто разбираю их. Некоторые из файлов содержат недопустимые uri для пространств имен. Например:Как пропустить проверку URI в lxml?

'D:\Path\To\some\local\file.xsl' 

Я получаю сообщение об ошибке при попытке обработать его:

lxml.etree.XMLSyntaxError: xmlns:xsi: 'D:\Path\To\some\local\file.xsl' is not a valid URI 

Существует простой способ заменить любой недействителен Ури с чем-то (что-либо, например, «http://www.googlefsdfsd.com/»)? Я думал о написании регулярного выражения, но надеялся на более простой способ.

+0

Что такое googlefsdfsd.com/? Он выглядит довольно сломанным для меня – Greg

+0

Это не имеет значения. Он не должен быть VALID-url, просто URL-адресом (что-то не локальное имя файла). –

+0

oh ok, теперь я понимаю – Greg

ответ

2

Что синтаксический анализатор не любит являются обратными косыми в URI пространства имен.

Для разбора XML, несмотря на недействительных URIs, вы можете создать экземпляр lxml.etree.XMLParser с recover аргументом, равным True, а затем использовать его для разбора файла:

from lxml import etree 
recovering_parser = etree.XMLParser(recover=True) 
xml = etree.parse("xmlfile.xml", parser=recovering_parser) 
... 
0

Если вы уверены, что эти конкретные ошибки не являются существенными для вашего случая использования вы могли бы просто поймать его как Exeption:

try: 
    # process your tree here 
    SomeFn() 

except lxml.etree.XMLSyntaxError, e: 
    print "Ignoring", e 
    pass 
+0

Ошибка не возникает, когда _processing_ дерево. URL-адрес пространства имен, содержащий обратную косую черту, приводит к ошибке при _parsing_ документе, поэтому вы даже не дойдете до точки, где у вас есть дерево, и ловить ошибку не поможет. – mata

+0

Возможно, вам нужно использовать один из 'r'D: \ Path \ To \ some \ local \ file.xsl'' или' D: \\ Path \\ To \\ some \\ local \\ file.xsl'' или 'D:/Path/To/some/local/file.xsl'' или, возможно,' 'файл: D: \ Path \ To \ some \ local \ file.xsl'' –

+0

Урис арен 't в коде python, они находятся в xml-файлах, поэтому префикс их с r или двойным экранированием обратных косых черт не имеет смысла (и я не думаю, что изменение всех файлов для замены обратных косых будет вариантом - ОП просто хочет разобрать документы). – mata