XMLStreamException : 解析错误
Posted
技术标签:
【中文标题】XMLStreamException : 解析错误【英文标题】:XMLStreamException : Parse error 【发布时间】:2015-05-07 02:36:08 【问题描述】:我有一个在 apache tomcat 6 上使用 java 5 解析 xml 文件的进程。 因为,我在 java 7 中编译并执行 join apache tomcat 7,我收到以下错误:
原因:javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,60] 消息:无效的编码名称“ISO8859-1”。 在 com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:219) 在 com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.(XMLStreamReaderImpl.java:189) 在 com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:262) 在 com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:129) 在 com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLEventReader(XMLInputFactoryImpl.java:78) 在 org.simpleframework.xml.stream.StreamProvider.provide(StreamProvider.java:66) 在 org.simpleframework.xml.stream.NodeBuilder.read(NodeBuilder.java:58) 在 org.simpleframework.xml.core.Persister.read(Persister.java:543) 在 org.simpleframework.xml.core.Persister.read(Persister.java:444)
这里是使用的 xml 片段:
?xml version="1.0" encoding="ISO8859-1" Standalone="no" ?
如果我将 ISO8859-1 替换为 UTF-8,解析过程可以正常工作,但它不是我的选择。
我使用的lib是simple-xml-2.1.8.jar
有人注意到我,ISO8859-1 是错误的内容类型。 ISO-8859-1 是正确的。正如我所提到的,很难要求“制作人”更正他们的文件。我想在我的应用程序中管理问题。
【问题讨论】:
【参考方案1】:如果您预先知道文件编码(UTF-8、ISO-8859-1 或其他),那么您应该为该编码创建一个合适的Reader
,然后使用采用@987654323 的Persister.read
方法@ 而不是采用File
或InputStream
的那个。这样您就可以控制字节到字符的解码,而不是依靠 XML 阅读器来检测编码(并且由于文件错误地声明它而失败)。所以不是
File f = new File(....);
MyType obj = persister.read(MyType.class, f);
你会做更多类似的事情
File f = new File(....);
MyType obj = null;
try( FileInputStream fis = new FileInputStream(f);
InputStreamReader reader = new InputStreamReader(fis, "ISO-8859-1")) // or UTF-8, ...
obj = persister.read(MyType.class, reader);
【讨论】:
【参考方案2】:从简单 XML 中获取对 Xerces XMLReader
实例的访问权限并设置
reader.setFeature("http://apache.org/xml/features/allow-java-encodings", true)
在解析 XML 之前。
由于 ISO8859-1 在 Java 中“有效”,这可能只是有效。
Xerces 支持的“功能”列表可在here 获得
或者,在处理 XML 之前,在 encoding="ISO8859-1"
上使用一个好的旧正则表达式来修复 XML 应该可以解决问题。
【讨论】:
感谢您的帮助,但我无法弄清楚如何从简单 XML 中获取“Xerces XMLReader 实例”。以上是关于XMLStreamException : 解析错误的主要内容,如果未能解决你的问题,请参考以下文章