我写了一个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);
1.NET技术研究中心:31647020
欢迎各位加入~

