在GAE上解析完全有效的XML时,“prolog中不允许内容”

在过去的48个小时里,我一直在与这个绝对令人恼火的错误搏斗,所以我想我终于认输了,在我把笔记本电脑扔出窗外之前,试着问一下这里

我正在尝试解析来自我对AWS SimpleDB的调用的响应XML。反应在电线上恢复得很好;例如,它可能看起来像:

<?xml version=“1.0”encoding=“utf-8”?>
<ListDomainsResponse xmlns=”http://sdb.amazonaws.com/doc/2009-04-15/“>
<ListDomainsResult>
<域名>音频&lt/域名>
<域名>课程&lt/域名>
<域名>文档内容&lt/域名>
<域名>讲师集&lt/域名>
<域名>元数据&lt/域名>
<域名>教授&lt/域名>
<域名>标签&lt/域名>
&lt/ListDomainsResult>
<ResponseMetadata>
<请求ID>42330b4a-e134-6aec-e62a-5869ac2b4575&lt/请求ID>
<BoxUsage>0.0000071759&lt/BoxUsage>
&lt/ResponseMetadata>
&lt/ListDomainsResponse>

我使用

XMLEventReader-eventReader=xmlInputFactory.createXMLEventReader(response.getContent());

并调用eventReader.nextEvent()多次获取我想要的数据

奇怪的是,它在本地服务器中工作得很好。我分析得到,大家都很高兴。问题是,当我将代码部署到Google App Engine时,传出的请求仍然有效,响应XML对我来说似乎100%相同且正确,但响应无法解析,出现以下异常:

com.amazonaws.http.HttpClient handleResponse:无法解组响应(解析错误位于[row,col]:[1,1]
消息:序言中不允许包含内容。):<?xml version=“1.0”encoding=“utf-8”?>
<ListDomainsResponse xmlns=”http://sdb.amazonaws.com/doc/2009-04-15/“&gt&书信电报;ListDomainsResult&gt&书信电报;域名>音频&lt/域名&gt&书信电报;域名>课程&lt/域名&gt&书信电报;域名>文档内容&lt/域名&gt&书信电报;域名>讲师集&lt/域名&gt&书信电报;域名>元数据&lt/域名&gt&书信电报;域名>教授&lt/域名&gt&书信电报;域名>标签&lt/域名&gt&lt/ListDomainsResult&gt&书信电报;ResponseMetadata&gt&书信电报;请求ID>42330b4a-e134-6aec-e62a-5869ac2b4575&lt/请求ID&gt&书信电报;BoxUsage>0.0000071759&lt/BoxUsage&gt&lt/ResponseMetadata&gt&lt/ListDomainsResponse>
javax.xml.stream.XMLStreamException:ParseError位于[row,col]:[1,1]
消息:prolog中不允许包含内容。
在com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(未知来源)
位于com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(未知源)
位于com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (其余行省略)

我对XML进行了双重、三重、四重检查,以查找“不可见字符”或非UTF8编码字符等。我在数组中逐字节查看它,查找字节顺序标记或类似的内容。没有什么它通过了我能做的每一个验证测试。更奇怪的是,如果我也使用基于Saxon的解析器,就会发生这种情况——但仅在GAE上,它在本地环境中总是工作得很好

当我只能在工作完美的环境中运行调试器时(我还没有找到任何在GAE上远程调试的好方法),跟踪代码的问题就变得非常困难了。尽管如此,我还是用我的原始方法尝试了一百万种方法,包括:

  • 带和不带序言的XML
  • 有无换行
  • 在序言中使用和不使用“encoding=”属性
  • 两种换行方式
  • 有和没有HTTP流中存在的分块信息

我已经尝试了多种组合,其中大多数组合都是有意义的,它们会相互作用——什么都没有!我束手无策。以前有没有人看到过这样的问题,希望能对此有所启发

谢谢

answer=“3030913”的数据

XML和XSD(或DTD)中的编码不同。
XML文件头:<?xml版本='1.0'编码='utf-8'?&gt
XSD文件头:<?xml版本='1.0'编码='utf-16'?&gt

另一种可能导致这种情况的情况是,XML文档类型声明之前出现了任何内容。i、 e缓冲区中可能有类似的内容:

helloworld<?xml version=“1.0”encoding=“utf-8”?>

甚至是空格或特殊字符

缓冲区中可能有一些称为字节顺序标记的特殊字符。
在将缓冲区传递给解析器之前,请执行以下操作

stringxml=“<?xml…”;
xml=xml.trim().replaceFirst(“^([\\W]+)<”,“<”;

发表评论