2017-05-31 22 views
0

これは私の初めてのSOAPリクエストとXMLの一般的な作業です。私は、SOAP要素にいくつかの名前空間を表示することはできません。私はこれを必要とする:複数の名前空間を持つJava SOAPElement

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/SoapEnvelope.xsd" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
     <cuns:HeaderInfo xmlns:cuns="http://website.com/cuns"> 
      <cuns:Field1>123456</cuns:Field1> 
      <cuns:Field2>987654321</cuns:Field2> 
     </cuns:HeaderInfo> 
    </soap:Header> 
    <soap:Body> 
     <n1:BodyField1 
      xsi:schemaLocation="http://website.xsi/location" 
      xmlns:cuns="http://website.com/cuns" 
      xmlns:n1="http://website.com/n1" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
      <Transaction> 
       ... 
      </Transaction> 

しかし、私の出力は私のxmlnsが欠落していた。この得られます。そこにいるにもかかわらず、XSI XSIを:schemaLocationのをBodyField1に。

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/SoapEnvelope.xsd" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
     <cuns:HeaderInfo xmlns:cuns="http://website.com/cuns"> 
      <cuns:Field1>123456</cuns:Field1> 
      <cuns:Field2>987654321</cuns:Field2> 
     </cuns:HeaderInfo> 
    </soap:Header> 
    <soap:Body> 
     <n1:BodyField1 
      xmlns:cuns="http://website.com/cuns" 
      xmlns:n1="http://website.com/n1" 
      xsi:schemaLocation="http://website.xsi/location"> 
      <Transaction> 
       ... 
      </Transaction> 

のxmlns:XSI減速がエンベロープとcunsのため正常に動作し、n1はBodyField1の下に表示されます。私のコードは明示的にxmlns:xsiを宣言し、次にxsi:schemaを宣言します。なぜ2つの他の名前空間とスキーマは表示されるのだろうが、xsi名前空間は表示されません。私は名前空間の異なる順序を試しましたが、それは重要ではないようです。 BodyField1のコードは次のとおりです。

public static void makeTransaction(Vector<Transaction> transactions, SOAPMessage message){ 

    DOMSource source = null; 
    Element superRoot = null; 
    SOAPBodyElement bodyRoot = null; 
    SOAPEnvelope envelope = null; 
    SOAPBody body = null; 

    try { 
     //Make the document 
     envelope = message.getSOAPPart().getEnvelope(); 
     body = envelope.getBody(); 

     Name n1 = envelope.createName("BodyField1", "n1", 
     "http://website.com/n1"); 
     bodyRoot = body.addBodyElement(n1); 

     bodyRoot.addNamespaceDeclaration("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
     bodyRoot.setAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation", 
     "http://schemas.xmlsoap.org/soap/envelope/SoapEnvelope.xsd"); 
     bodyRoot.addNamespaceDeclaration("cuns", "http://website.com/cuns"); 

    } catch (SOAPException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
    } 
} 

答えて

0

これが他の人に役立つ場合は、後でお答えください。私の場合、xmlsns:xsiが来ていましたが、xsi:schemalocationではなく、同様の問題の解決策を探していました。以下は私のためのトリックでした。

SOAPElement eleXSINs = envelope.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance"); 
eleXSINsfor .setAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation", "http://xxxxxx.xsd"); 
関連する問題