RSS
热门关键字:  数据挖掘  人工智能  数据仓库  搜索引擎  数据挖掘导论
当前位置 :| 首页>编程技术>xml技术>

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

来源: 作者: 时间:2008-03-11 点击:

我写了一个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)

数据挖掘研究院

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?