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

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值