请问用JDOM进行Schema校验的问题

我写了一个Schema和一个基于它的xml文档

XML code
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="lab"> <xs:complexType> <xs:all> <xs:element name="persons"> <xs:complexType> <xs:sequence> <xs:element name="person" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="name" use="required"/> <xs:attribute name="age" default="32"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:all> </xs:complexType> </xs:element> </xs:schema>
数据挖掘研究院

------------------------------------------------------------
XML code
<?xml version="1.0" encoding="UTF-8"?> <lab xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="labschema.xsd"> <persons> <person name="axm"/> <person name="" age="38"/> </persons> </lab>

------------------------------------------------------------
然后写了一段用schema校验文档的代码,用了JDOM,如下所示:
Java code
SAXBuilder builder = new SAXBuilder(); builder.setValidation(true); builder.setFeature("http://apache.org/xml/features/validation/schema", true); builder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",schemaPath); try { Document doc = builder.build(new File(path)); Element element = doc.getRootElement(); System.out.println(element.getName()); element = element.getChild("persons"); List<Element> persons = element.getChildren(); for(Element person: persons) { System.out.println(person.getAttributeValue("name")); System.out.println(person.getAttributeValue("age")); } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
数据挖掘研究院

但是始终会在build那报异常,如下:
org.jdom.input.JDOMParseException: Error on line 2 of document file:/C:/Documents%20and%20Settings/Administrator/桌面/TestXML/test.xml: cvc-elt.1: Cannot find the declaration of element 'lab'.
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:501)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:847)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:826)
at Test.fun(Test.java:29)
at Test.main(Test.java:18)
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'lab'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 数据挖掘交友
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

数据挖掘论坛


at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:489)
... 4 more
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'lab'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source) 数据挖掘交友
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:489)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:847) 数据挖掘实验室
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:826)
at Test.fun(Test.java:29)
at Test.main(Test.java:18)
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'lab'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)

数据挖掘研究院


at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:489)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:847)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:826)
at Test.fun(Test.java:29) 数据挖掘研究院
at Test.main(Test.java:18)

如果将validate去掉就能正常工作。
问题是为何会找不到“lab”标签呢?多谢需哦写

另外说一下,是JDK6

是否路径错误?
我用你代码测试了一下,一切正常。
环境:XSD和XML放同一文件夹下,schemaPath直接填xsd。

这样啊?因为我不管怎么试都不能得到正常的结果。不论如何,非常感谢:)

首先,xsd和xml是放在同一个文件夹下的,path和schemaPath得到的是它们的绝对路径
我查阅了大量相关的问题,有的说是名字空间的问题,我尝试把schema加上targetNamesapce,然后用external-schemaLocation作property,还是不成功。
下了一个单独版本的Xerces,然后用

Java code
builder.setValidation(“org.apache.xerces.parsers.SAXParser", true);
数据挖掘研究院

初始化,然后还是不成功。

但是尝试了用JAXP校验后后却正常通过,代码如下:
Java code
public void jaxpValidate() { //parse an XML in non-validating mode and create a DOMSource DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); dbfactory.setNamespaceAware(true); dbfactory.setXIncludeAware(true); DocumentBuilder parser; try { parser = dbfactory.newDocumentBuilder(); Document doc = parser.parse(new File(path)); DOMSource xmlsource = new DOMSource(doc); // create a SchemaFactory for loading W3C XML Schemas SchemaFactory wxsfactory = SchemaFactory .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // set the errorhandler for handling errors in schema itself // wxsfactory.setErrorHandler(schemaErrorHandler); // load a W3C XML Schema Schema schema = wxsfactory.newSchema(new File(schemaPath)); // create a validator from the loaded schema Validator validator = schema.newValidator(); // set the errorhandler for handling validation errors // validator.setErrorHandler(validationErrorHandler); // validate the XML instance validator.validate(xmlsource); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
数据挖掘研究院

其中并没有报异常,所以我认为它校验通过了。

现在我怀疑是JDOM或者Xerces不兼容的bug。我用的JDOM是1.1版,Xerces是2.9.1版,都是现在最新的。JDK是1.6u4(JAXP1.3)。请问你的环境是什么?多谢。

上面那个初始化的代码写错了,应该是

Java code
SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);

数据挖掘实验室

JDOM 1.0,Xerces用的是JDOM包里面的lib下的。

新开论坛:http://www.netcsharp.cn/,有不少技术文章,欢迎各位光临,同时介绍下相关QQ群:
1.NET技术研究中心:31647020

欢迎各位加入~

Create By Any-Extract(WL-AE)

[数据挖掘专家] [数据挖掘研究院] [数据挖掘论坛] [数据挖掘实验室]
上一篇:soap协议的小问题---
下一篇:请教大家一个问卷系统设计的问题
最新评论共有 0 位网友发表了评论 , 查看所有评论
发表评论( 不能超过250字,需审核,请自觉遵守互联网相关政策法规。 )
匿名?
数据挖掘网站导航 数据挖掘论坛导航
  • 数据挖掘工具
  • 数据挖掘论坛
  • DataCruncher - Cognos
  • MineSet - MathSoft
  • Intelligent Miner - GainSmarts
  • Sqlserver - SAS - Clementine
  • CART - Weka - WizSoft
  • NeuroShell - ModelQuest
  • data mining tools - Darwin
  • 数据挖掘交友
  • 数据挖掘博客
  • 数据挖掘工具
  • 数据挖掘资源
  • 数据挖掘技术算法
  • 数据挖掘相关期刊、会议
  • 研究院联盟合作专区
  • 数据挖掘基础与相关技术
  • 数据挖掘厂商与就业
  • 数据挖掘研究者乐园
  • 知名厂商数据挖掘工具资料
  • 国内数据挖掘实验室
  • Foreign Data Mining Lab
  • 热点关注
  • W3C概述
  • ASP+soap调用web service的问题,高手帮忙
  • 什么是语义网?
  • RSS History
  • 求助,PHP讀取XML文件
  • xml+xsl+js实现一个有横向列的导航菜单?
  • XML基础之 DataSet加载XML数据文件
  • 如何在xml中保存图片,以二进制流的形式保存
  • XML & 数据融合
  • Final Component of the Complete Meta Dat
  • 论坛最新话题
  • Foundations of Statistical Natural Langu
  • Game Theory meet Data Mining: A Recent P
  • System Building: How does it help or hin
  • 数据挖掘与Clementine培训
  • 新手报到
  • 求 SASEM 客户流失预测分析
  • 数据挖掘工程师/搜索研究院—北京——无线
  • 数据挖掘入门介绍(如何着手数据挖掘)
  • Information Overload Survey Results
  • The INEX 2005 Workshop on Element Retrie
  • 相关资讯
  • What's Still Wrong with SQL Native XML I
  • Final Component of the Complete Meta Dat
  • What's Still Wrong with SQL Native XML I
  • XML及其技术指南
  • 保存.NET应用程序设置
  • 在.NET Framework中轻松处理XML数据(4
  • 将改变我们生活的这些XML应用之一
  • XML、Web服务和.NET框架
  • flash中通过XMLSocket监控生产系统(2
  • 将改变我们生活的这些XML应用之二
  • 数据挖掘实验室资料
  • 数据挖掘博客地址
  • 数据挖掘实验室网站地址
  • Prepare for Medicare audits by using dat
  • 注册成为SAS用户与爱好者俱乐部会员
  • 水南梅
  • 明日烟
  • 新人报道
  • 下载
  • 厦门服务器托管,450元/月—0592-5177319 高
  • 买空间送域名--0592-5177319 高静