Java1.6中使用SAX解析XML并使用schema验证时
验证同一个XML文件,使用同一个Schema文件,DOM方式与SAX方式结果却不一样。
xml文件内容:
<?xml version="1.0" encoding="gb2312"?>
<action-config xmlns="my:schema">
</action-config>
Schema文件内容:
<?xml version="1.0" encoding="GBK" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tholoz="my:schema"
targetNamespace="my:schema" elementFormDefault="qualified">
<xsd:element name="action-config">
<xsd:complexType>
<xsd:attribute name="default-method" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
根据schema,这个xml文件的内容应该是不合法的。
使用DOM的方式解析:
SchemaFactory sf
= SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(schemaFile);
DocumentBuilderFactory dbf
= DocumentBuilderFactory.newInstance();
dbf.setIgnoringComments(true);
dbf.setNamespaceAware(true);
dbf.setSchema(schema);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File(xmlFile));
运行这段代码,抛出了XML不合法的异常,应该是这样的。
使用SAX方式验证:
SchemaFactory sf
= SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(schemaFile);
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setValidating(true);
spf.setSchema(schema);
SAXParser sp = spf.newSAXParser();
sp.parse(new File(xmlFile), handler);
运行这段代码,没有像预期的一样抛出异常。
从思路上说,在SAXParserFactory对象上设置了schema对象,也应该根据该schema对象来验证XML文件啊,但为什么没有呢?
如果使用SAXParserFactory.setSchema设置了schema对象,但没有验证,那要这个方法来干嘛使?难道这是一个bug?
或者说我的用法不对?
请高人指点。