您的位置:首页 > 其它

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

2017-10-17 09:23 561 查看
在用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";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐