XMLStreamException:解析错误

时间:2015-03-05 16:24:46

标签: java xml

我有一个在apache tomcat 6上使用java 5解析xml文件的进程。 既然,我在java 7中编译了一个执行连接apache tomcat 7,我收到以下错误:

Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,60]
Message: Invalid encoding name "ISO8859-1".
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:219)
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.(XMLStreamReaderImpl.java:189)
    at com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:262)
    at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:129)
    at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLEventReader(XMLInputFactoryImpl.java:78)
    at org.simpleframework.xml.stream.StreamProvider.provide(StreamProvider.java:66)
    at org.simpleframework.xml.stream.NodeBuilder.read(NodeBuilder.java:58)
    at org.simpleframework.xml.core.Persister.read(Persister.java:543)
    at org.simpleframework.xml.core.Persister.read(Persister.java:444)

以下是使用的xml片段:

?xml version="1.0" encoding="ISO8859-1" standalone="no" ?

如果我用UTF-8替换ISO8859-1,解析过程有效,但对我来说不是一个选择。

我使用的lib是simple-xml-2.1.8.jar

有人注意到我,ISO8859-1是错误的内容类型。 ISO-8859-1是正确的。正如我所提到的,很难问及生产者"纠正他们的文件。我想在我的应用程序中管理问题。

2 个答案:

答案 0 :(得分:2)

从Simple XML访问Xerces XMLReader实例并设置

reader.setFeature("http://apache.org/xml/features/allow-java-encodings", true)

解析XML之前

因为ISO8859-1"工作"在Java中,这可能会起作用。

支持的"功能列表" of Xerces可用here

或者,在处理它之前,encoding="ISO8859-1"上用于修复XML的好的旧正则表达式应该可以解决问题。

答案 1 :(得分:1)

如果您事先知道文件编码(UTF-8,ISO-8859-1或其他),那么您应该为该编码创建合适的Reader,然后使用Persister.read方法取Reader而不是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);
}