Я пытаюсь выполнить запрос к базе данных, а затем преобразовать файлоподобный объект, который он возвращает, в документ 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
Похоже, что RDF-сервер доставляет простой текст на ваш вызов urllib.urlopen.
Вы должны быть в состоянии, с установкой правильного заголовка
Accept: application/sparql-results+xml, */*;q=0.5
, чтобы получить ответ xml. Вы должны прочитать подробности спецификации протокола RDF openRDF - для openRDF существует более одного формата.
Похоже, что-то не так с вашим XML-файлом, прямо в строке 1, столбце 4.
Я попробовал это, и то, что я получил, не похоже на XML для меня.Вот первые восемь символов, как предположил Алекс:
>>> raw_result.read(8) 'BRTR\x00\x00\x00\x03'
Ваш сервер требователен к заголовку 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.
urllib2.Request
Есть ли шанс опубликовать фрагмент XML? Парсер указывает, что ошибка происходит в самой первой строке. Я предполагаю, что форматирование выключено или сообщает неправильно, что заставляет EXPAT выдавать исключение сразу.
Я предполагаю, что первая строка что-то нарушает в "правильно сформированном" XML-контенте. Для справки, вы можете сравнить с http://en.wikipedia.org/wiki/XML