Xsd 使用dom4j DOMDocument为validator.validate(DOMSource)提供数据在Java1.6中失败(不允许使用xsi:noNamespaceSchemaLocation),在1.5中有效
使用dom4j DOMDocument为validator.validate(DOMSource)提供数据在Java1.6中失败(使用xsi:noNamespaceSchemaLocation不允许出现在根元素中),在1.5中工作 我发现以下问题相当棘手(好吧,这是一个轻描淡写的说法)-任何见解都将受到赞赏。目前看来,最好的办法是放弃dom4j,转而支持例如XOM(http://stackoverflow.com/questions/831865/what-java-xml-library-do-you-recommend-to-replace-dom4j) 我一直在验证从dom4j“new DOMDocument()”创建的内存中XML,但这不适用于Java 6 以下对dom4j(1.6.1)DOMDocument派生的DOMSource的验证(源)调用适用于Java 1.5.x,但在Java 1.6.x中失败:Xsd 使用dom4j DOMDocument为validator.validate(DOMSource)提供数据在Java1.6中失败(不允许使用xsi:noNamespaceSchemaLocation),在1.5中有效,xsd,java-6,dom4j,saxparseexception,Xsd,Java 6,Dom4j,Saxparseexception,使用dom4j DOMDocument为validator.validate(DOMSource)提供数据在Java1.6中失败(使用xsi:noNamespaceSchemaLocation不允许出现在根元素中),在1.5中工作 我发现以下问题相当棘手(好吧,这是一个轻描淡写的说法)-任何见解都将受到赞赏。目前看来,最好的办法是放弃dom4j,转而支持例如XOM(http://stackoverflow.com/questions/831865/what-java-xml-library-do
public void validate() throws Exception {
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setErrorHandler(null);
Schema schemaXSD = schemaFactory.newSchema(new URL(getSchemaURLString()));
Validator validator = schemaXSD.newValidator();
DOMSource source = new DOMSource(getDocument());
validator.validate(source);
}
getSchemaURLString()还用于将xsi:noNamespaceSchemaLocation属性添加到根节点,即:
xsi:noNamespaceSchemaLocation=”http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd“
例外情况如下:
Exception: org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in element 'specialfields'.;
complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in element 'specialfields'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:417)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3182)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processAttributes(XMLSchemaValidator.java:2659)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:2066)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:705)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.beginNode(DOMValidatorHelper.java:273)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:240)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:186)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:104)
at javax.xml.validation.Validator.validate(Validator.java:127)
以下是禁用对validator.validate(源代码)的调用后生成的XML的开始:
.............
和XSD的:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="meetings">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="summary" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="meeting" />
</xs:sequence>
<xs:element ref="error" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="summary">
................
................
因此,我的根元素被拒绝,因为它包含xsi:noNamespaceSchemaLocation属性。模式本身没有将其指定为根元素的有效属性
在这一点上,我似乎需要放弃dom4j来完成这项任务,转而使用其他解决方案之一,例如,如下所述:
但我想知道我到底做错了什么
提前感谢。我也有同样的问题,我在 根据文档指定的架构进行验证 一些文档指定了它们希望验证的模式, 通常使用xsi:noNamespaceSchemaLocation和/或 xsi:schemaLocation属性如下: 然而,通常这不是你想要的。通常是文件 使用者应该选择模式,而不是文档生产者。 此外,这种方法仅适用于XSD。所有其他模式 语言需要显式指定的架构位置
原因似乎是正在创建和使用不支持名称空间的JAXP SAXParser(请参阅) 以及我在中找到的不同LIB的解决方案。错误报告在“specialfields”上,但您将“meetings”显示为根元素(而不显示“specialfields”)。一种可能性是,在“specialfields”上,xsi前缀解析为
http://www.w3.org/2001/XMLSchema-instance
。
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="meetings">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="summary" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="meeting" />
</xs:sequence>
<xs:element ref="error" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="summary">
................
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">
...
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();