【问题标题】:trouble parsing XML in python在 python 中解析 XML 时遇到问题
【发布时间】:2011-03-16 05:33:01
【问题描述】:

我正在尝试查询数据库,然后将它返回的类文件对象转换为 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:格式不正确(无效标记):第 1 行,第 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 个字符? – Jeff 0 秒前编辑

【问题讨论】:

  • 为什么不显示该 XML 的前 8 个字符? repr(raw_result[:8])。所以你会在第 4 栏看到究竟是什么困扰着它,别想了?-)

标签: python xml xmlhttprequest


【解决方案1】:

您的服务器在决定发回什么以及以何种格式发回时对接受标头很挑剔。以下应该有效:

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

【讨论】:

    【解决方案2】:

    你有机会发布 XML sn-p 吗?解析器指示错误发生在第一行。我的猜测是格式关闭或报告不正确,这导致 EXPAT 立即抛出异常。

    我的猜测是第一行违反了“格式良好的 XML”内容中的某些内容。作为参考,您可以与http://en.wikipedia.org/wiki/XML进行比较

    【讨论】:

      【解决方案3】:

      您的 XML 文件似乎有问题,就在第 1 行第 4 列。

      我试过这个,但我得到的东西对我来说不像 XML。正如 Alex 所建议的,这里是前八个字符:

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

      【讨论】:

        【解决方案4】:

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

        你应该可以,设置正确的标题

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

        ,获取 xml 响应。您必须阅读 openRDF 的 RDF 协议规范以了解详细信息 - openRDF 不止一种格式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多