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

在过去的48小时里,我一直在对付这个绝对令人愤怒的虫子,所以我想我最终会扔在毛巾上,在我把笔记本电脑从窗户里扔出去之前,先试着问这里。

我试图从我对AWS SimpleDB的调用中parsing响应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传递给parsing器

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

并调用eventReader.nextEvent(); 一堆时间来获得我想要的数据。

这是奇怪的部分 – 它在本地服务器内部工作得很好。 回答来了,我parsing,大家都很开心。 问题是,当我将代码部署到Google App Engine时,传出的请求仍然有效,并且响应XML似乎与我完全相同且正确,但响应无法parsing,但出现以下exception:

 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编码的字符,等等。我在字节顺序标记或这种性质的东西在字节中看字节。 没有; 它通过了我可以投入的每个validationtesting。 即使是陌生人,如果我使用基于撒克逊语的parsing器,也会发生这种情况 – 但是仅在GAE上,它在我的本地环境中总能正常工作。

当我只能在完美工作的环境下运行debugging器时(我还没有find任何可以在GAE上远程debugging的好方法),就很难追踪问题的代码。 尽pipe如此,我使用了原始手段,我尝试了一百万种方法,包括:

  • 有和没有序言的XML
  • 有和没有换行符
  • 在序言中有和没有“编码=”属性
  • 两种换行样式
  • 有或没有HTTPstream中的分块信息

而且我已经尝试了多种组合,其中有多less意义上他们会互动 – 没有什么! 我在智慧的结尾。 有没有人看到过这样的问题,希望能够对此有所了解?

谢谢!

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

导致这种情况的另一种可能的情况是什么时候在XML文档types声明之前。 即你可能在缓冲区中有这样的东西:

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

甚至是空间或特殊字符。

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

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

此错误消息始终是由开始元素中的无效XML内容引起的。 例如,在XML元素的开始处多出一个小点“。”。

<?xml…. ”之前的任何字符<?xml…. “会导致上面的” org.xml.sax.SAXParseException:内容不允许在prolog “错误信息。

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

要解决这个问题,只需删除“<?xml“之前的所有奇怪的字符即可。

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

我面临同样的问题。 在我的情况下,XML文件是从C#程序生成的,并传入AS400进行进一步处理。 经过一些分析后发现我在生成XML文件时使用了UTF8编码,而javac(在AS400中)使用了“没有BOM的UTF8”。 所以,必须编写类似于下面提到的代码:

 //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 

在我的XML文件中,标题看起来像这样:

 <?xml version="1.0" encoding="utf-16"? /> 

在一个testing文件中,我正在读取文件字节,并以UTF-8解码数据(没有意识到这个文件中的头文件是utf-16)来创build一个string。

 byte[] data = Files.readAllBytes(Paths.get(path)); String dataString = new String(data, "UTF-8"); 

当我试图将这个string反序列化成一个对象时,我看到了同样的错误:

 javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Message: Content is not allowed in prolog. 

当我更新第二行

 String dataString = new String(data, "UTF-16"); 

我能够反序列化对象就好了。 正如罗曼在上面指出的,编码需要匹配。

我正在面对同样的问题,我的XML文件中称为“内容不允许在序言”。

最初我的根文件夹是'# 文件名 '。

当我删除第一个字符“#”,错误得到解决。

不需要删除#filename …以这种方式尝试..

而不是将文件或URL对象传递给unmarshaller方法,请使用FileInputStream。

 File myFile = new File("........"); Object obj = unmarshaller.unmarshal(new FileInputStream(myFile)); 

我有一个制表符而不是空格。 replace标签“\ t”解决了这个问题。

将整个文档剪切并粘贴到像Notepad ++这样的编辑器中,并显示所有的字符。

在我的问题中,解决scheme是用它们的HTML代码replace德语变音符号(äöü)。

波纹pipe是上面的原因“org.xml.sax.SAXParseException:内容不允许在prolog”exception。

  1. 首先检查schema.xsd和file.xml的文件path。
  2. XML和XSD(或DTD)中的编码应该相同。
    XML文件标题: <?xml version='1.0' encoding='utf-8'?>
    XSD文件头: <?xml version='1.0' encoding='utf-8'?>
  3. 如果在XML文档typesdeclaration.ie之前有任何内容: hello<?xml version='1.0' encoding='utf-16'?>