3

次の XML を検証しようとしています

<query>
 <colors logic="AND">
  <color main="BLUE" tone="DARK" operator="=" />
 </colors>
</query>

次のXSDを使用して

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:complexType name="color">
     <xsd:attribute name="main" type="xsd:string" use="required"/>
     <xsd:attribute name="tone" type="xsd:string" use="required"/>
     <xsd:attribute name="operator" type="xsd:string"/>
 </xsd:complexType>
 <xsd:complexType name="colors">
     <xsd:sequence>
         <xsd:element name="color" type="color" maxOccurs="unbounded">   </xsd:element>
     </xsd:sequence>
     <xsd:attribute name="logic" type="xsd:string" use="required"/>
 </xsd:complexType>
 <xsd:complexType name="query">
     <xsd:sequence>
         <xsd:element name="colors" type="colors" maxOccurs="2"></xsd:element>
     </xsd:sequence>
 </xsd:complexType>
 <xsd:element name="query" type="query"></xsd:element>
</xsd:schema>

だから...名前空間なしでXMLを検証したい。XML は別のアプリケーションによって生成されているため、変更できません。クライアントが正しい要求を送信していることをサーバー側で保証したいだけです。

XSD に対して XML を検証しようとすると、次の例外メッセージが表示されます。

cvc-elt.1: Cannot find the declaration of element 'query'

私はすでに検索して、このような解決策に行き着きましが、成功しませんでした

解決策(私を正しい方向に向けてくれた@Trarothに感謝します)---

これを検証する方法は次のとおりです。

私はこの機能を持っています:

public static Document buildValidRequest(String content, Schema xsd) throws SAXParseException, SAXException, IOException, ParserConfigurationException {

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    factory.setValidating(false);
    factory.setNamespaceAware(true);

    factory.setSchema(xsd);

    XMLSimpleErrorHandler errorHandler = new XMLSimpleErrorHandler();

    DocumentBuilder builder = factory.newDocumentBuilder();
    builder.setErrorHandler(errorHandler);

    StringReader reader = new StringReader(content);

    Document validXML = builder.parse(new InputSource(reader));

    if (errorHandler.getException() != null) {
        throw errorHandler.getException();
    }

    return validXML;

}

そして、エラーを処理するこのクラス:

public class XMLSimpleErrorHandler implements ErrorHandler {

private SAXParseException exception;

@Override
public void warning(SAXParseException e) {
    this.exception = e;
}

@Override
public void error(SAXParseException e) {
    this.exception = e;
}

@Override
public void fatalError(SAXParseException e) {
    this.exception = e;
}

public SAXParseException getException() {
    return exception;
}
}

そして、スキーマを取得するこのメソッド:

private static Schema getSchema(String xsdPath) throws SAXException, IOException {
    InputStream resourceAsStream = null;
    try {
        ServiceManager.getInstance().getLoggerManager().debug(RESTInitServlet.LOGCONTEXT, TAG, "Retrieving schema: "+xsdPath);
        resourceAsStream = getInstance().getClass().getResourceAsStream(xsdPath);
        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Source schemaSource = new StreamSource(resourceAsStream);
        Schema schema = schemaFactory.newSchema(schemaSource);
        return schema;
    } finally {
        if (resourceAsStream != null) {
            resourceAsStream.close();
        }
    }

}

これを気にしないでください: すべての中で最も奇妙なこと: Windows 7 で実行されている Tomcat 6 で動作します。Linuxで実行されているjbossで動作しません...

4

3 に答える 3

1

遠回りかもしれませんが、JBoss 5.0 または .1 を使用したときに、使用したxerces実装に深刻なバグが見つかったことを覚えています。バージョンのバグを確認するか、新しいバージョンの xerces ライブラリを試してください。

于 2012-06-21T20:25:20.003 に答える
1

ここで答えを見つける必要があります: http://www.edankert.com/validate.html#Validate_using_external_Schema

于 2012-06-21T13:55:19.227 に答える
0

インスタンス ドキュメントとスキーマ ドキュメントは問題ないようです。検証を呼び出す方法に問題があります。

于 2012-06-21T15:21:40.643 に答える