5

dom4j DOMDocument を使用して validator.validate(DOMSource) をフィードすると Java 1.6 で失敗し (xsi:noNamespaceSchemaLocation をルート要素に表示することは許可されていません)、1.5 で機能します。

次の問題は非常に扱いにくいと思います(OK、それは控えめな表現です)-洞察をいただければ幸いです。現在、XOM (http://stackoverflow.com/questions/831865/what-java-xml-library-do-you-recommend-to-replace-dom4j) などを優先して dom4j を削除するのが最善の方法のようです。

dom4j 'new DOMDocument()' から作成された XML をメモリ内で検証してきましたが、これは Java 6 では機能しません。

次の dom4j (1.6.1) DOMDocument 派生 DOMSource の validate(source) の呼び出しは、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 属性をルート ノードに追加するためにも使用されます。

例外は次のとおりです。

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)

これが XML の始まりです - validator.validate(source) への呼び出しを無効にした後に生成されます。

<?xml version="1.0" encoding="utf-8"?> 
<meetings xsi:noNamespaceSchemaLocation="http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
.............
</meetings>

そして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 をあきらめて、他のソリューションの 1 つに切り替える必要があるように思えます。

しかし、とにかく私が間違ったことを知りたいです!

前もって感謝します。

4

2 に答える 2

3

同じ問題があり、次のドキュメントを見つけました

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html

ドキュメント指定のスキーマに対して検証する

一部のドキュメントは、通常、次のように xsi:noNamespaceSchemaLocation および/または xsi:schemaLocation 属性を使用して、検証されると予想されるスキーマを指定します。

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">  
 ...

URL、ファイル、またはソースを指定せずにスキーマを作成すると、Java 言語は、使用するスキーマを見つけるために検証中のドキュメントを参照するスキーマを作成します。例えば:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 
Schema schema = factory.newSchema();

ただし、通常、これは必要なものではありません。通常、ドキュメントのプロデューサーではなく、ドキュメントのコンシューマーがスキーマを選択する必要があります。さらに、このアプローチは XSD に対してのみ機能します。他のすべてのスキーマ言語では、スキーマの場所を明示的に指定する必要があります。

于 2012-07-30T16:09:01.117 に答える
0

その理由は、名前空間を認識しない JAXP SAXParser が作成され、使用されているためと思われます (リンクを参照)。

www.edankert.comで見つけたさまざまなライブラリのソリューション。

于 2013-01-08T18:01:38.407 に答える