在 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>
        <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
  • 有和没有换行符
  • 序言中带有和不带有“encoding=”属性
  • 两种换行样式
  • HTTP 流中存在和不存在分块信息的情况

而且我已经在多种组合中尝试了其中的大多数,它们会交互是有意义的——没有!我无计可施。有没有人在此之前看到过这样的问题,希望能对此有所了解?

谢谢!

原文由 Adrian Petrescu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 707
2 个回答

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]+)<","<");

原文由 Romain Hippeau 发布,翻译遵循 CC BY-SA 2.5 许可协议

我在 notepad++ 中检查 xml 文件并保存文件时遇到问题,尽管我的顶级 utf-8 xml 标记为 <?xml version="1.0" encoding="utf-8"?>

通过使用 Encoding(Tab) > Encode in UTF-8:selected (was Encode in UTF-8-BOM) 将文件保存在 notpad++ 中得到修复

原文由 techloris_109 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题