在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。
- 首先检查schema.xsd和file.xml的文件path。
- XML和XSD(或DTD)中的编码应该相同。
XML文件标题:<?xml version='1.0' encoding='utf-8'?>
XSD文件头:<?xml version='1.0' encoding='utf-8'?>
- 如果在XML文档typesdeclaration.ie之前有任何内容:
hello<?xml version='1.0' encoding='utf-16'?>
- 如何在Google App Engine中写入控制台?
- Google App Engine上的Ruby on Rails应用程序
- 如何上传和存储与谷歌应用程序引擎的图像(Java)
- Google Blobstore与Google云端存储
- Android客户端的AccountManager中的AuthToken不再工作
- 根据文件夹结构,Google App Engine应用中的默认服务/模块可以是非默认服务/模块的兄弟吗?
- 如何删除Google Application Engine中未使用的索引?
- Google App Engine Java上的RESTful应用程序?
- Google App Engine版本号?