[英]Want to throw exception when encounter special UTF-8 characters in an XML file
我正在解析一个具有UTF-8编码的XML文件。
<?xml version="1.0" encoding="UTF-8"?>
现在,我们的业务应用程序具有一组由不同团队开发的组件,并且不使用相同的库来解析XML。 我的组件使用JAXB,而其他组件使用SAX等等。 现在,当XML文件具有特殊字符,如“ä”或“ë”或“é”(带有变音符号的字符)时,JAXB会正确解析它,但其他组件(子应用程序)无法正确解析它们并引发异常。
由于业务需要,我无法更改其他组件的编程,但我必须在我的应用程序中放置限制/验证,以确保XML(数据加载)文件不包含任何此类字符。
确保该文件不包含上述(或类似)字符的最佳方法是什么,并且在我开始使用JAXB解析XML文件之前,我可以在那里抛出异常(或给出错误)。
如果您的客户向您发送带有标题的XML文件,其中编码与文件内容不匹配,您可能会放弃尝试对该文件执行任何有意义的操作。 - 它们是否真的在标题与实际编码不匹配的情况下发送数据? 那不是XML。 你应该多给他们充电;-)
只需逐字节读取文件作为FileInputStream。 如果它包含负字节值,则拒绝处理它。
您可以保留UTF-8或ISO 8859-1等编码设置,因为它们都有US-ASCII作为正确的子集。
是的,我的回答与laune提到的相同......
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;
}
}
我只是添加一个代码片段...
您应该能够将XML输入包装在java.io.Reader
中,您可以在其中指定实际编码,然后正常处理。 Java将利用XML中为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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.