【发布时间】:2011-03-03 03:13:33
【问题描述】:
在过去的 48 小时里,我一直在与这个绝对令人愤怒的 bug 搏斗,所以我想我最终还是认输并尝试在这里询问,然后再将笔记本电脑扔出窗外。
我正在尝试解析来自我对 AWS SimpleDB 的调用的响应 XML。响应很好地回到了网络上。例如,它可能看起来像:
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
我通过
将此 XML 传递给解析器XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
并多次致电eventReader.nextEvent(); 以获取我想要的数据。
这是奇怪的部分——它在本地服务器中运行良好。响应进来了,我解析一下,大家都很开心。问题是,当我将代码部署到 Google App Engine 时,传出请求仍然有效,响应 XML 对我来说似乎 100% 相同且正确,但响应无法解析,并出现以下异常:
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines omitted)
我对这个 XML 进行了双重、三重、四重检查以查找“不可见字符”或非 UTF8 编码字符等。我在数组中逐字节查看字节顺序标记或类似性质的东西.没有;它通过了我可以进行的所有验证测试。更奇怪的是,如果我也使用基于 Saxon 的解析器,就会发生这种情况——但仅在 GAE 上,它在我的本地环境中总是可以正常工作。
当我只能在完美运行的环境中运行调试器(我还没有找到任何在 GAE 上远程调试的好方法)时,很难跟踪代码中的问题。尽管如此,使用我拥有的原始方法,我已经尝试了一百万种方法,包括:
- 带有和不带有序言的 XML
- 有和没有换行符
- prolog 中有和没有“encoding=”属性
- 两种换行样式
- HTTP 流中存在和不存在分块信息
而且我已经在多种组合中尝试了其中的大多数,它们可以交互 - 没有!我无计可施。有没有人在此之前看到过这样的问题,希望能对此有所了解?
谢谢!
【问题讨论】:
-
我们可能需要查看更多代码。另一种可能性是在本地它没有被分块,而在 GAE 上它是。在将代码传递给解析器之前,您是如何处理代码的?
-
我也考虑了分块的可能性,但似乎并非如此,因为解析器抛出的错误消息包含整个 XML 就在那里(它已粘贴在上面)。整个修改后的 SDK 代码可以在 github.com/AdrianP/aws-sdk-for-java 找到(查看最近的提交),但是那里有很多代码。我会尽快尝试创建一个更小的可重现样本,尽管即使那样也很难。这是一个非常复杂的软件......不过感谢您的反馈! :)
-
@Raedwald,我不认为我的问题是重复的,因为我的问题比那个问题早一年发布:)
-
这应该是一个应该如何在 SO 上提出问题的示例,通读它给了我关于如何作为开发人员进行调试的各种见解(感谢 OP)
标签: java xml google-app-engine parsing stax