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 方法@ 而不是采用FileInputStream 的那个。这样您就可以控制字节到字符的解码,而不是依靠 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 : 解析错误的主要内容,如果未能解决你的问题,请参考以下文章

Java stax:对实体“R”的引用必须以“;”结尾分隔符

StaX:序言中不允许的内容

Java.swl.x.

cxf HashMap 传输中文

解析包错误怎么解决

为啥这个解析错误在这里解析错误:语法错误,意外标识符“编辑”,期待“,”或“;”? [复制]