Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xsd 使用dom4j DOMDocument为validator.validate(DOMSource)提供数据在Java1.6中失败(不允许使用xsi:noNamespaceSchemaLocation),在1.5中有效_Xsd_Java 6_Dom4j_Saxparseexception - Fatal编程技术网

Xsd 使用dom4j DOMDocument为validator.validate(DOMSource)提供数据在Java1.6中失败(不允许使用xsi:noNamespaceSchemaLocation),在1.5中有效

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

使用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中失败:

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();