SAX Xml->SAXParseException在文档的元素内容中找到无效的 XML 字符 (Unicode: 0x10)

在用SAX解析xml时,遇到文件中含unicode字符,则会抛出SAXParseException。



    
        Spring in Action
        45.0
    
    
        HG6201M     
        39.0
    
其实当文件较大时,部分某一条的数据并不是很重要,我们希望能够略过这条数据或对这条数据作特殊处理,而不是当遇到解析错误时终止解析。

参考如下:

MyHander handler = new MyHander();
InputStream is = Test.class.getClass().getResourceAsStream("/file/book.xml");
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();
//关键设置
reader.setFeature("http://apache.org/xml/features/continue-after-fatal-error",true);
reader.setContentHandler(handler);
reader.setErrorHandler(handler);
reader.parse(new InputSource(is));

自定义Hander:

public class ParseXmlHandler extends DefaultHandler {

    private String tag;
    private StringBuffer sb = null;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        tag = qName;
        sb = new StringBuffer();
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        tag = null;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (tag != null) {
            if (sb == null) {
                System.out.println("error");
            } else {
                sb.append(ch, start, length);
                System.out.println(sb.toString());
            }
        }
    }

    @Override
    public void fatalError(SAXParseException e) throws SAXException {
        sb = null;
    }
}

源码解析:

1.查找到当解析错误时抛出异常的类
SAX Xml->SAXParseException在文档的元素内容中找到无效的 XML 字符 (Unicode: 0x10)_第1张图片

可以看到在XMLErrorReporter.java中有段代码,当fContinueAfterFatalError为false时则解析抛出异常。

case SEVERITY_FATAL_ERROR: {
    errorHandler.fatalError(domain, key, parseException);
    if (!fContinueAfterFatalError) {
       throw parseException;
    }
    break;
}
则应设置 fContinueAfterFatalError为true,该类的setFeature方法则可以设置fContinueAfterFatalError的属性

SAX Xml->SAXParseException在文档的元素内容中找到无效的 XML 字符 (Unicode: 0x10)_第2张图片

查看其常量值进行对应的设置

    public static final String XERCES_FEATURE_PREFIX = "http://apache.org/xml/features/";
    public static final String CONTINUE_AFTER_FATAL_ERROR_FEATURE = "continue-after-fatal-error";


你可能感兴趣的:(JAVA)