微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在GAE上解析完全有效的XML时,“序言中不允许内容”

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

导致这种情况的另一种可能的情况是,在XML文档类型声明之前发生了任何事情。即您可能在缓冲区中有以下内容

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

甚至是空格或特殊字符。

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

String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");

解决方法

在过去的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,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
  • 有无换行符
  • 在序言中是否包含“ encoding =“属性
  • 两种换行样式
  • HTTP流中是否存在分块信息

而且我已经尝试了多种组合中的大多数方法,在这些组合中它们会相互作用是很有意义的-什么都没有!我机智的尽头。有没有人看到过这样的问题,希望可以对此有所启发?

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。