繁体   English   中英

想要在XML文件中遇到特殊的UTF-8字符时抛出异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM