Java1.6中使用SAX解析XML并使用schema验证时

whodsow 2008-12-20 11:42:37
验证同一个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?
或者说我的用法不对?
请高人指点。
...全文
298 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
孤单的苍鹰 2012-01-04
他不仅跨年回答问题,他居然还跨了两年。。。
回复
batistutaluke 2012-01-04
6楼回复的不是一般的晚~~呵呵
回复
CS_Mercy 2010-03-11
方法一:使用schema验证xml文档
Source source = new StreamSource(new File("c:/sample.xml"));
schema.newValidator().validate(source);
代码如上,用schema对象创建一个Validator(我就叫他验证器吧!),然后使用这个验证器去校验你的xml文件.

方法二:在parser xml文档的过程中作验证
parser.parse(new File("c:/sample.xml"), new DefaultHandler() {
@Override
public void error(SAXParseException e) throws SAXException {
e.printStackTrace();
}
});
代码如上,在parser的过程中,DefaultHandler中的error这个方法会捕获异常.在这个方法中加上e.printStackTrace();

貌似回答的晚了一些,我刚刚看到.
回复
noenoughmemory 2008-12-28
友情up
回复
lyih_tom_com 2008-12-28
顶一下
使用 SAXParser 另外一种方式去设置schema的话是应该是可以检验出来的
回复
whodsow 2008-12-26
不是哟?????????没人回顾 .
回复
tjgbl 2008-12-26
不懂,up
回复
ooily 2008-12-26
不懂,up
回复
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2008-12-20 11:42
社区公告
暂无公告