0

Webservice からの応答である xml ファイルがあります。さまざまな名前空間が含まれています。適切な XSD で検証しようとすると、「org.xml.sax.SAXParseException: cvc-elt.1: 要素 'SOAP-ENV:Envelope' の宣言が見つかりません。」がスローされます。すべての名前空間の名前空間宣言は、応答で宣言されます。以下は私のコードです

try {
        DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance();
            SchemaFactory schemaFactory = SchemaFactory
            .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            SAXSource mainInputStream = new SAXSource(new InputSource(new FileInputStream(new File("FIXEDINCOME_v3_0.xsd"))));
            SAXSource importInputStream1 =new SAXSource(new InputSource(new FileInputStream(new File("Rating.xsd"))));
            SAXSource importInputStream2 = new SAXSource(new InputSource(new FileInputStream(new File("Datatypes.xsd"))));
            Source[] sourceSchema = new SAXSource[]{mainInputStream , importInputStream1, importInputStream2};
            Schema schema = schemaFactory.newSchema(sourceSchema);  
            xmlFact.setNamespaceAware(true);
            xmlFact.setSchema(schema);
            DocumentBuilder builder = xmlFact.newDocumentBuilder();
            xmlDOC = builder.parse(new InputSource(new StringReader(inputXML)));
            NamespaceContext ctx = new NamespaceContext() {
                public String getNamespaceURI(String prefix) {
                    String uri;
                    if (prefix.equals("ns0"))
                        uri = "http://namespace.worldnet.ml.com/EDS/Standards/Common/Service_v1_0/";
                    else if (prefix.equals("ns1"))
                        uri = "http://namespace.worldnet.ml.com/EDS/Product/Services/Get_Product_Data_Svc_v3_0/";
                    else if (prefix.equals("ns2"))
                        uri = "http://namespace.worldnet.ml.com/DataSOA/Product/Objects/FixedIncome/FixedIncome_v3_0/";
                    else if (prefix.equals("ns3")) {
                        uri = "http://namespace.worldnet.ml.com/DataSOA/Product/Objects/Rating/Rating_v2_0/";
                    } else if (prefix.equals("SOAP-ENV")) {
                        uri = "http://schemas.xmlsoap.org/soap-envelope/";
                    } else
                        uri = null;

                    return uri;
                }

                // Dummy implementation - not used!
                public Iterator getPrefixes(String val) {
                    return null;
                }

                // Dummy implemenation - not used!
                public String getPrefix(String uri) {
                    return null;
                }
            };

            XPathFactory xpathFact = XPathFactory.newInstance();
            xPath = xpathFact.newXPath();
            xPath.setNamespaceContext(ctx);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
4

3 に答える 3

1

SOAP-ENV プレフィックスの名前空間定義の検出に問題があるとは思いません。バリデーターは、SOAP-ENV:Envelope 要素を検証するために、その名前空間で使用される要素を定義する XSD ファイルを必要とするため、そのスキーマがどこにあるかをバリデーターに伝える必要があります。

解決策は、XML レスポンスに以下を追加することだと思います。

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsi="http://schemas.xmlsoap.org/soap/envelope/"
  xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/      
           http://schemas.xmlsoap.org/soap/envelope/">

または、そのスキーマを Web からダウンロードし、XSD ファイルとしてローカル ファイルシステムに保存して、sourceSchemaアレイに追加します。コード (および XML) の移植性が高いため、最初の方法を優先する必要があります。

于 2012-08-24T16:12:44.983 に答える
0

SOAP-ENV に次の URI を使用してみましたか?

http://schemas.xmlsoap.org/soap/envelope/

于 2012-08-24T13:11:12.897 に答える
0

検証用に提供する一連のスキーマには、soap スキーマが含まれていません。スキーマ コレクションに soap スキーマを含めるか、soap ラッパーの検証を気にしない場合は、実際の本文コンテンツ要素を取得して、そこから検証を実行することができます。

于 2012-08-24T15:49:46.830 に答える