проблема разбора XML в Python - PullRequest
0 голосов
/ 15 июля 2010

Я пытаюсь выполнить запрос к базе данных, а затем преобразовать файлоподобный объект, который он возвращает, в документ XML.Вот что я делал:

>>> import urllib, xml.dom.minidom
>>> query = "http://sbol.bhi.washington.edu/openrdf-sesame/repositories/sbol_test?query=select%20distinct%20%3Fname%20%3Ffeaturename%20where%20%7B%3Fpart%20%3Chttp%3A%2F%2Fsbol.bhi.washington.edu%2Frdf%2Fsbol.owl%23annotation%3E%20%3Fannotation%3B%3Chttp%3A%2F%2Fsbol.bhi.washington.edu%2Frdf%2Fsbol.owl%23status%3E%20'Available'%3B%3Chttp%3A%2F%2Fsbol.bhi.washington.edu%2Frdf%2Fsbol.owl%23name%3E%20%3Fname.%3Fannotation%20%3Chttp%3A%2F%2Fsbol.bhi.washington.edu%2Frdf%2Fsbol.owl%23feature%3E%20%3Ffeature.%3Ffeature%20%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23type%3E%20%3Chttp%3A%2F%2Fsbol.bhi.washington.edu%2Frdf%2Fsbol.owl%23binding%3E%3B%3Chttp%3A%2F%2Fsbol.bhi.washington.edu%2Frdf%2Fsbol.owl%23name%3E%20%3Ffeaturename%7D"
>>> raw_result = urllib.urlopen(query)
>>> xml_result = xml.dom.minidom.parse(raw_result)

Эта последняя команда дает мне

xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 4

Почти то же самое происходит, если я использую xml.etree.ElementTree для анализа.Я думаю, что они оба используют Expat.Странно то, что если вместо загрузки файла в Python я просто вставляю запрос в Firefox, полученный файл можно очень хорошо прочитать, используя open (path_to_file, "r").

Есть идеи, что этомогло быть?

ОБНОВЛЕНИЕ: Это первая строка файла:

<?xml version='1.0' encoding='UTF-8'?> 

Однако это может быть не то, что в raw_result ... это то, что вы получаете после загрузки запроса-результата.srx и изменив расширение на .txt.Расширение файла не имеет значения, не так ли?Кроме того, я довольно новичок во всей этой вещи XML - почему столбец 4 является восьмым символом?- Джефф 0 секунд назад edit

Ответы [ 4 ]

0 голосов
/ 15 июля 2010

Похоже, что RDF-сервер доставляет простой текст на ваш вызов urllib.urlopen.

Вы должны быть в состоянии, с установкой правильного заголовка

Accept: application/sparql-results+xml, */*;q=0.5

, чтобы получить ответ xml. Вы должны прочитать подробности спецификации протокола RDF openRDF - для openRDF существует более одного формата.

0 голосов
/ 15 июля 2010

Похоже, что-то не так с вашим XML-файлом, прямо в строке 1, столбце 4.

Я попробовал это, и то, что я получил, не похоже на XML для меня.Вот первые восемь символов, как предположил Алекс:

>>> raw_result.read(8)
'BRTR\x00\x00\x00\x03'
0 голосов
/ 15 июля 2010

Ваш сервер требователен к заголовку accept, решая, что отправлять обратно и в каком формате. Должно работать следующее:

In [265]: import urllib2

In [266]: req = urllib2.Request(query, headers={'Accept':'application/xml'})

In [267]: rsp = urllib2.urlopen(req)

In [268]: xml = minidom.parse(rsp)

In [268]: xml.toxml()[:64]
Out[268]: u'<?xml version="1.0" ?><sparql xmlns="http://www.w3.org/2005/spar'

Обратите внимание на заголовок подтверждения в urllib2.Request.

0 голосов
/ 15 июля 2010

Есть ли шанс опубликовать фрагмент XML? Парсер указывает, что ошибка происходит в самой первой строке. Я предполагаю, что форматирование выключено или сообщает неправильно, что заставляет EXPAT выдавать исключение сразу.

Я предполагаю, что первая строка что-то нарушает в "правильно сформированном" XML-контенте. Для справки, вы можете сравнить с http://en.wikipedia.org/wiki/XML

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...