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上远程调试的好方法).尽管如此,使用我所拥有的原始方法,我已经尝试了一百万种方法,包括:
而且我已经尝试了多种组合中的大多数,它们是有意义的,它们会互动 - 没有!我的智慧结束了.有没有人在此之前看到过这样的问题,希望能够对此有所了解?
谢谢!
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)
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 中编码)
此错误消息始终由begin元素中的无效XML内容引起.例如,XML元素开头的额外小点".".
" <?xml…." 之前的任何字符都会导致" org.xml.sax.SAXParseException:prolog中不允许使用内容 "错误消息.
一个小点" ." 之前“<?xml….
要修复它,只需删除所有那些奇怪的字符“<?xml“.
参考:http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/
小智 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)
| 归档时间: |
|
| 查看次数: |
362286 次 |
| 最近记录: |