当前位置: 首页 > 面试题库 >

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

卞坚成
2023-03-14
问题内容

在过去的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,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流中是否存在分块信息

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

谢谢!


问题答案:

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


 类似资料:
  • 这是一个XML文档(XML声明和XSLT处理指令之前的句子和空格是输入的一部分): 我正在解析XML并使用XPath。在大多数XML文件中,第一行包含一些文本或空格(参考上面的XML) 如果没有前导文本,则会成功解析,但如果出现任何文本,则会产生以下错误: [致命错误]:1:1:Prolog中不允许有内容。 我怎么能绕过这件事? 我正在使用的代码: 我可以手动删除文本并执行,但我需要在我的代码中解

  • 问题内容: 我运行Intellij,当我尝试运行android应用程序时,总是出现内部错误:序言中不允许内容。我认为我已经尽力修复了所有问题,但没有任何效果。之前,我在AndroidManifest中没有做任何特别的事情,所以我不知道为什么它不起作用。 问题答案: 关闭Intellij想法 去你的工作区 删除.idea文件夹 打开您的项目并导入。

  • 我试图在Java运行一个程序,它接受一个自定义的XML文件并对其进行解析。我正在使用XML文件进行存储。我在错误日志中得到以下错误。 XML文件的开头包括: 程序能够读入XML文件。我得到了上面的错误。下面是一段代码片段: 在我看来,我的XML文件的prolog中没有无效的内容。我想不出有什么问题。请帮帮忙。多谢了。

  • 问题内容: 我正在使用Java,并且试图从某个http链接获取XML文档。我使用的代码是: 不要关注,它是一些特殊的类,就像常规输入流一样。 使用上面的代码,有时会出错。我认为这与xml格式错误有关,但我不知道如何解决。 问题答案: 我将我的评论转为答案,因此它可以被接受,并且这个问题不再悬而未决。 造成这种情况的最可能原因是格式错误的响应,其中包括在initial之前的字符。因此,请查看通过HT

  • 我正在尝试获取XML文件并将其解析到数据库中。XML是用GZIP压缩的。GZIP文件是~8MB。当我在本地运行代码时,pythonw上的内存将被占用。exe的版本升级到整个系统(Windows 7)停止响应的级别,当我在线运行它时,它超过了Google App Engine上的内存限制。不确定文件是否太大或我是否做错了什么。任何帮助都将不胜感激! 使现代化 所以我试着按照BasicWolf的建议切

  • 问题内容: 我在网站上的头像上传中遇到此错误。我从来没有得到过它,最近没有任何改变让我开始收到此错误… 问题答案: 修改PHP配置中的设置(请参阅 运行时配置)。 该设置主要用于防止特定用户的PHP脚本访问另一个用户帐户中的文件。因此,通常,您自己的帐户中的任何文件都应该可以被您自己的脚本读取。 通过PHP在Linux系统上是否作为Apache模块运行的示例设置: