我有一个在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是正确的。正如我所提到的,很难问及生产者"纠正他们的文件。我想在我的应用程序中管理问题。
答案 0 :(得分:2)
从Simple XML访问Xerces XMLReader
实例并设置
reader.setFeature("http://apache.org/xml/features/allow-java-encodings", true)
。
因为ISO8859-1"工作"在Java中,这可能会起作用。
支持的"功能列表" of Xerces可用here
或者,在处理它之前,encoding="ISO8859-1"
上用于修复XML的好的旧正则表达式应该可以解决问题。
答案 1 :(得分:1)
如果您事先知道文件编码(UTF-8,ISO-8859-1或其他),那么您应该为该编码创建合适的Reader
,然后使用Persister.read
方法取Reader
而不是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);
}