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

来源:互联网 发布:安卓 平板 软件 编辑:程序博客网 时间:2024/05/22 21:21

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

<?xml version="1.0" encoding="UTF-8"?><books>    <book id="12">        <name>Spring in Action</name>        <price>45.0</price>    </book>    <book id="15">        <name>HG6201M     </name>        <price>39.0</price>    </book></books>
其实当文件较大时,部分某一条的数据并不是很重要,我们希望能够略过这条数据或对这条数据作特殊处理,而不是当遇到解析错误时终止解析。

参考如下:

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.查找到当解析错误时抛出异常的类

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

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


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

    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";


阅读全文
0 0