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

Adr*_*scu 93 java xml google-app-engine parsing stax

在过去的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>
Run Code Online (Sandbox Code Playgroud)

我将此XML传递给解析器

XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我有两倍,三倍,四倍检查此XML用于"隐形字符"或非UTF8编码字符等.我在数组中逐字节地查看字节顺序标记或类似的东西.没有; 它通过我可以抛出的每个验证测试.更奇怪的是,如果我使用基于Saxon的解析器也会发生 - 但仅在GAE上,它总是在我的本地环境中正常工作.

当我只能在一个完美运行的环境上运行调试器时,很难跟踪问题的代码(我还没有找到任何在GAE上远程调试的好方法).尽管如此,使用我所拥有的原始方法,我已经尝试了一百万种方法,包括:

  • 有和没有prolog的XML
  • 有和没有换行
  • 在prolog中有和没有"encoding ="属性
  • 两种换行样式
  • 有和没有HTTP流中存在的分块信息

而且我已经尝试了多种组合中的大多数,它们是有意义的,它们会互动 - 没有!我的智慧结束了.有没有人在此之前看到过这样的问题,希望能够对此有所了解?

谢谢!

Rom*_*eau 113

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"?>  
Run Code Online (Sandbox Code Playgroud)

甚至是空间或特殊角色.

有一些称为字节顺序标记的特殊字符可以在缓冲区中.在将缓冲区传递给Parser之前,请执行此操作...

String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这也救了我。xml.trim().replaceFirst("^([\\W]+)&lt;","&lt;"); (2认同)
  • 有人请将此作为可接受的答案。立即解决我的问题。我正在解析以“ Message:&lt;?xml version ....”开头的Message。问题是xml位之前的文本。谢谢 :) (2认同)

tec*_*109 10

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

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


Sun*_*rme 7

此错误消息始终由begin元素中的无效XML内容引起.例如,XML元素开头的额外小点".".

" <?xml…." 之前的任何字符都会导致" org.xml.sax.SAXParseException:prolog中不允许使用内容 "错误消息.

一个小点" ." 之前“<?xml….

要修复它,只需删除所有那些奇怪的字符“<?xml“.

参考:http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/

  • 你应该提到你提到的地方http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/ (2认同)

小智 7

我今天收到了同样的错误消息。解决办法就是将文档从UTF-8 with BOM改为UTF-8 without BOM


小智 5

我面临同样的问题.在我的例子中,XML文件是从c#程序生成的,并被送入AS400进行进一步处理.经过一些分析确定我在生成XML文件时使用UTF8编码,而javac(在AS400中)使用"UTF8无BOM".因此,必须编写类似于下面提到的额外代码:

//create encoding with no BOM
Encoding outputEnc = new UTF8Encoding(false); 
//open file with encoding
TextWriter file = new StreamWriter(filePath, false, outputEnc);           

file.Write(doc.InnerXml);
file.Flush();
file.Close(); // save and close it
Run Code Online (Sandbox Code Playgroud)