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();
自定义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";
<?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";
相关文章推荐
- org.xml.sax.SAXParseException; lineNumber: 456; columnNumber: 67; 在 CDATA 节中找到无效的 XML 字符 (Unicode: 0
- org.xml.sax.SAXParseException; 元素内容必须由格式正确的字符数据或标记组成
- org.xml.sax.SAXParseException; lineNumber: 71; columnNumber: 54; 元素内容必须由格式正确的字符数据或标记组成。
- org.xml.sax.SAXParseException: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止。
- nested exception is org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 56; cvc-complex-type.2.4.c通配符的匹配很全面, 但无法找到元素 'dubbo:application' 的声明
- Caused by: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 16; 文档根元素 "configuration" 必须匹
- org.xml.sax.SAXParseException: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止。
- Spring Boot+Thymeleaf出现org.xml.sax.SAXParseException: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止。
- org.xml.sax.SAXParseException: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止。
- org.xml.sax.SAXParseException 文档根元素 "mapper" 必须匹配 DOCTYPE 根 "configuration"
- cxf之org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 37; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'jaxws:server' 的声明。
- org.xml.sax.SAXParseException 文档根元素 "mapper" 必须匹配 DOCTYPE 根 "configuration"
- org.xml.sax.SAXParseException: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止。
- Caused by: org.xml.sax.SAXParseException; 通配符的匹配很全面, 但无法找到元素 'context:property-placeholder' 的声明。
- Caused by: org.xml.sax.SAXParseException; lineNumber: 70; columnNumber: 10; 元素类型为 "mapper" 的内容必须匹配 "
- org.xml.sax.SAXParseException 文档根元素 "mapper" 必须匹配 DOCTYPE 根 "configuration"
- 在 CDATA 节中找到无效的 XML 字符 (Unicode: 0x1f)
- Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
- org.xml.sax.SAXParseException; lineNumber: 18; columnNumber: 41; schema_reference无法读取方案文档 'http://co
- org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 语法分析器在此文档中遇到多个 "64,000" 实体扩展; 这是应用程序施加的限制