在python中解析XML时遇到问题
我试图查询数据库,然后将它返回的类似文件的对象转换为XML文档。以下是我一直在做的事情:在python中解析XML时遇到问题,python,xml,xmlhttprequest,Python,Xml,Xmlhttprequest,我试图查询数据库,然后将它返回的类似文件的对象转换为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%3Fpar
>>> 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.parsers.expat.expat错误:格式不正确(无效令牌):第1行第4列
如果我使用xml.etree.ElementTree进行解析,几乎会发生同样的情况。我想他们都使用外籍人士。奇怪的是,如果我没有用python加载文件,而是将查询粘贴到Firefox中,那么可以使用open(path_to_file,“r”)很好地读入生成的文件
你知道这是什么吗
更新:
这是文件的第一行:
<?xml version='1.0' encoding='UTF-8'?>
然而,这可能不是原始结果中的内容。。。这是下载query-result.srx并将扩展名更改为.txt后得到的结果。文件扩展名不重要,是吗?另外,我对xml这整件事还很陌生,为什么第4列是第8个字符Jeff 0秒前编辑有没有可能发布XML片段?解析器指示错误发生在第一行。我的猜测是格式设置不正确或报告不正确,这导致EXPAT立即抛出异常
我猜第一行违反了“格式良好的XML”内容中的某些内容。作为参考,您可以将XML文件与第1行第4列的内容进行比较 我尝试过这个,但我得到的东西在我看来不像XML。以下是Alex建议的前八个字符:
>>> 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'
[265]中的:导入urllib2
在[266]中:req=urllib2.Request(查询,标题={'Accept':'application/xml'})
在[267]中:rsp=urllib2.urlopen(req)
在[268]中:xml=minidom.parse(rsp)
在[268]中:xml.toxml()[:64]
Out[268]:u'RDF服务器似乎正在向您的urllib.urlopen调用传递纯文本
您应该能够设置正确的标题
Accept: application/sparql-results+xml, */*;q=0.5
,以获取xml响应。您必须阅读的RDF协议规范以了解详细信息-openRDF有多种格式。为什么不显示该XML的前8个字符<代码>报告(原始结果[:8])
。所以你会在第4栏看到到底是什么困扰着它,dontchathink?-)