在过去的48个小时里,我一直在努力解决这个极其恼人的错误,所以我想在我将笔记本电脑扔出窗户之前,在这里试着来问问。
我正在尝试解析我从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 看起来与我预期的完全一致和正确,但是出现以下异常无法解析响应:
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编码字符等问题。我通过字节方式在数组中逐字节查看是否存在字节顺序标记或类似的内容,但什么都没有发现。这个XML文件通过了我能够施加的所有验证测试。更奇怪的是,如果我使用基于Saxon的解析器,它也会出现相同的问题——但只有在GAE上,而在我的本地环境中一切正常。这使得当我只能在完全正常的环境上运行调试器时,要追踪代码中的问题变得非常困难(我还没有找到任何远程调试GAE的好方法)。尽管如此,我尝试了无数种方法,包括:
- 使用和不使用XML声明 - 使用和不使用换行符 - 在XML声明中使用和不使用“encoding=”属性 - 两种换行样式 - 在HTTP流中使用和不使用分块信息
我已经尝试了其中大部分的组合,但仍然没有发现问题。我已经束手无策了。有没有人见过类似的问题,并能帮我找到一些线索呢?
谢谢!