2010-07-15 61 views
0

我想查询一个数据库,然后将它返回到XML文档的类文件对象转换。这是我一直在做的事情:在Python中解析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”)完美地读取生成的文件。

任何想法这可能是什么?

UPDATE: 这是文件的第一行:

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

但是这可能不是什么在raw_result ...那是你下载查询result.srx和更改扩展名后会得到什么。文本。文件扩展名不重要吗?另外,我对这个完整的xml事物很新颖 - 为什么第4列是第8个字符? - Jeff 0秒前编辑

+1

为什么不显示该XML的第一个8个字符? '再版(raw_result [:8])'。所以你会在第4列dontchathink看到究竟是什么困扰它 - - – 2010-07-15 05:56:36

回答

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的接受头。

+0

谢谢,这完美的作品。 – Jeff 2010-07-15 06:35:05

0

你有可能发布XML片段吗?解析器指出错误发生在第一行。我的猜测是格式化不正确或报告不正确,这导致EXPAT立即抛出异常。

我的猜测是第一行违反了“格式正确的XML”内容。作为参考,你可以比较反对http://en.wikipedia.org/wiki/XML

0

貌似东西是错误的XML文件,右行约1,4列

我想这一点,并且我得到了什么并不像XML我。这里是前八个字,亚历克斯建议:

>>> raw_result.read(8) 
'BRTR\x00\x00\x00\x03' 
0

看来,RDF服务器正在向您的urllib.urlopen调用传递纯文本。

你应该能够与设置正确的头

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

,以获得XML响应。您必须阅读RDF协议规范openRDF以了解详细信息 - openRDF有多种格式。