0

SAX を使用して SOAP リクエストを解析および検証しようとしています。2 つの XSD が必要です。1 つは SOAP エンベロープ ( http://schemas.xmlsoap.org/soap/envelope/ ) 用で、もう 1 つは私が定義したものです。これら 2 つの XSD に対して要求を適切に検証する方法が見つかりません。

リクエストを解析し、soapenv.xsd に対して検証するために使用するコードを次に示します。それは正常に動作します。代わりに XSD を指定すると、検証は「要素 'soapenv:Envelope' の宣言が見つかりません」で失敗します。

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);

SAXParser saxParser = factory.newSAXParser();       
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", MyClass.class.getResourceAsStream("/xml/soapenv.xsd"));

InputSource is = new InputSource(MyClass.class.getResourceAsStream("/xml/request.xml"));
XMLReader reader = saxParser.getXMLReader();
reader.setContentHandler(new MyHandler());
reader.setErrorHandler(new MyErrorHandler());
reader.parse(is);

2 番目の XSD を指定するにはどうすればよいですか?

SOAP リクエストを解析して検証するより良い方法はありますか?

編集

提案どおり、2 つの XSD をインポートする thirdpty.xsd を作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="thirdparty:general"
xmlns="thirdparty:general"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:import schemaLocation="D:\ucfed\ValidateWSDL\src\xml\soapenv.xsd" 
       namespace="http://schemas.xmlsoap.org/soap/envelope/"/>

    <xs:import schemaLocation="D:\ucfed\ValidateWSDL\src\xml\Presence.xsd" 
       namespace="thirdparty:presence"/>    
</xs:schema>

検証用にこの新しい XSD を指定します。

saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", MyClass.class.getResourceAsStream("/xml/thidpty.xsd"));

ただし、検証には SOAP エンベロープ XSD のみが使用されます。他の XSD から 1 つの要素を変更すると、検証でそれが検出されません。

ここに私が検証しようとしているxmlがあります

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="thirdparty:presence">
    <soapenv:Header/>
    <soapenv:Body>
        <urn:getPresenceQuery>
            <urn:origAccount uri="test@origin.com"/>
            <urn:destAccount uri="test@destination.com"/>
        </urn:getPresenceQuery>
    </soapenv:Body>
</soapenv:Envelope>

他のアイデア?

4

1 に答える 1

0

他の 2 つをインポートするドライバー スキーマ ドキュメントを作成します。ドライバーに対して検証します。

于 2013-08-30T23:33:13.270 に答える