我正在尝试查询数据库,然后将它返回的文件类对象转换为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中的内容...这是您在下载query-result.srx并将扩展名更改为.txt后得到的内容。文件扩展名没关系吗?另外,我对这整个xml事情都很陌生 - 为什么第4列是第8个字符? - 杰夫0秒前编辑
答案 0 :(得分:0)
您是否有机会发布XML片段?解析器指示错误发生在第一行。我的猜测是格式化关闭或报告不正确,这导致EXPAT立即抛出异常。
我的猜测是,第一行违反了“格式良好的XML”内容中的内容。作为参考,您可以与http://en.wikipedia.org/wiki/XML
进行比较答案 1 :(得分:0)
您的XML文件看起来有问题,就在第1行第4列。
我试过这个,我得到的东西对我来说看起来不像XML。这是前八个字符,正如亚历克斯建议的那样:
>>> raw_result.read(8)
'BRTR\x00\x00\x00\x03'
答案 2 :(得分:0)
您的服务器在确定要发回的内容以及采用哪种格式时对于接受标头非常挑剔。以下应该有效:
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
中的接受标题。
答案 3 :(得分:0)
似乎RDF服务器正在向您的urllib.urlopen调用提供纯文本。
您应该可以设置正确的标题
Accept: application/sparql-results+xml, */*;q=0.5
,获取xml响应。您需要阅读openRDF的RDF协议规范以获取详细信息 - openRDF有多种格式。