最佳答案
过去的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 对我来说似乎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 上远程调试的好方法) ,那么就很难跟踪代码以查找问题。尽管如此,使用我已经掌握的原始方法,我已经尝试了上百万种方法,包括:
我已经尝试了大多数这些在多个组合中,它们有意义的互动-什么也没有!我已经无计可施了。有没有人见过这样的问题之前,希望可以提供一些线索?
谢谢!