我正在解析一个使用UTF-8编码的XML文件。
<?xml version="1.0" encoding="UTF-8"?>
现在,我们的业务应用程序有一组组件,这些组件由不同的团队开发,并且不使用相同的库来解析XML。我的组件使用JAXB,而其他一些组件使用SAX等等。现在,当XML文件包含特殊字符,如"ä“、"ë”或"é“(带有变音字符)时,JAXB可以正确地解析它,但其他组件(子应用程序)无法正确解析它们并抛出异常。
由于业务需要,我不能更改其他组件的编程,但我必须在我的应用程序中设置限制/验证,以确保XML (数据加载)文件不包含任何此类字符。
什么是确保文件不包含上述(或类似)字符的最佳方法,并且可以在开始使用JAXB解析XML文件之前抛出异常(或给出错误)。
发布于 2014-07-28 19:45:48
如果您的客户发送给您的XML文件的头中的编码与文件内容不匹配,您不妨放弃尝试并对该文件执行任何有意义的操作。-他们是否真的在发送报头与实际编码不匹配的数据?那么这就不是XML了。你应该向他们收取更高的费用;-)
只需将文件作为FileInputStream逐字节读取即可。如果它包含负字节值,则拒绝处理它。
您可以保留像UTF-8或ISO 8859-1这样的编码设置,因为它们都将US-ASCII作为正确的子集。
发布于 2014-07-28 19:58:56
是的,我的回答和劳恩提到的一样……
static boolean readInput() {
boolean isValid = true;
StringBuffer buffer = new StringBuffer();
try {
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis);
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char)ch);
System.out.println("ch="+ch);
//TODO - check range for each character
//according the wikipedia table http://en.wikipedia.org/wiki/UTF-8
//if it's a valid utf-8 character
//if it's not in range, the isValid=false;
//and you can break here...
}
in.close();
return isValid;
}
catch (IOException e) {
e.printStackTrace();
return false;
}
}我只是添加了一个代码片段...
发布于 2014-07-28 20:37:02
您应该能够将XML输入包装在java.io.Reader中,在其中指定实际的编码,然后正常处理。Java将利用在InputStream中指定的编码,但是当使用Reader时,将使用Reader的编码。
Unmarshaller unmarshaller = jc.createUnmarshaller();
InputStream inputStream = new FileInputStream("input.xml");
Reader reader = new InputStreamReader(inputStream, "UTF-16");
try {
Address address = (Address) unmarshaller.unmarshal(reader);
} finally {
reader.close();
}https://stackoverflow.com/questions/24994107
复制相似问题