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