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?
或者说我的用法不对?
请高人指点。
...全文
364 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤单的苍鹰 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

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧