簡體   English   中英

如何將 XML 請求附加到 SOAP 主體的唯一 SOAPElement 子級?

[英]How do I append an XML request to the only SOAPElement child of the SOAP Body?

用例

我需要以編程方式聯系外部 SOAP 服務。 為此,我需要創建一個如下所示的 SOAP 請求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pric="http://myURI/">
   <soapenv:Header/>
   <soapenv:Body>
      <pric:myAPI>
        <XmlDocument>
            <OtherXmlContent>
            </OtherXmlContent>
        </XmlDocument>
      </pric:myAPI>
   </soapenv:Body>
</soapenv:Envelope>

我被阻止的任務

我設法創建了以下 SOAP 信封:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pric="http://myURI/">
   <soapenv:Header/>
   <soapenv:Body>
      <pric:myAPI>

      </pric:myAPI>
   </soapenv:Body>
</soapenv:Envelope>

在提供輸入的情況下,我需要做的是添加 XML 請求:

<XmlDocument>
    <OtherXmlContent>
    </OtherXmlContent>
</XmlDocument>

... 作為<pric:myAPI>的孩子,這是我的<soapenv:Body>的唯一孩子。

有關信息,上面的 Soap 信封(還沒有XmlDocument )是由以下代碼創建的:

MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration(pricingNamespace, pricingNamespaceURI);
SOAPBody soapBody = envelope.getBody();
SOAPElement pricingWrapper = soapBody.addChildElement(pricingAction, pricingNamespace);

...因此,我需要做的是將一個孩子附加到pricingWrapper 我選擇如何創建這個孩子,我可以完全控制生成它的函數,這是這個:

private static String createXmlProductFromDealingDocument(Document dealings) 

嘗試 1 - 將文檔添加為文本

我試圖將XmlDocument添加為pricingWrapper文本。 我是這樣做的:

pricingWrapper.addTextNode(createXmlProductFromDealingDocument(dealingFile));

但是,問題在於呈現為StringXmlDocument所有字符<>都被addTextNode方法addTextNode 換句話說,我可以看到我的身體有正確的內容,但是<被替換為&lt; 並且>被替換為&gt; ,因此使 SOAP 請求對目標服務無效。

嘗試 2 - 添加文檔作為子節點

我所做的另一個嘗試是從我的函數中返回一個Node而不是一個String

private static Node createXmlProductFromDealingDocument(Document dealings) 

並將此Node附加為pricingWrapper的子Node

pricingWrapper.appendChild(createXmlProductFromDealingDocument(dealingFile));

以上引發了以下類型的異常:

org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: 節點在與創建它的文檔不同的文檔中使用。

好,可以。 昨天我發布了一個問題(因為我想深入研究,所以很快就刪除了),一位用戶在評論中好心地建議我參考這個答案來檢查如何克隆 DOM 節點。

我嘗試這樣做:

Node pricingRequest = createXmlProductFromDealingDocument(dealingFile);
Node soapPricingRequest = pricingRequest.cloneNode(true);
pricingWrapper.getOwnerDocument().adoptNode(soapPricingRequest);
pricingWrapper.appendChild(soapPricingRequest);

然而,這引發了一個新的例外:

org.w3c.dom.DOMException: NOT_SUPPORTED_ERR: 實現不支持請求的對象或操作類型。

...在以下行:

pricingWrapper.getOwnerDocument().adoptNode(soapPricingRequest);

...而且我真的不知道我可以如何以與上面所做的不同的方式附加孩子。

我的問題是什么

我只想以正確的方式完成我的 SOAP 請求。 我沒有任何偏好是通過將 XML 作為文本注入還是作為Node注入來完成,只要是正確的方法,特別是只要它有效:) 任何人都可以提示我如何解決我的上述問題?

閱讀 AdoptNode() 的 javadoc :

DOMException - NOT_SUPPORTED_ERR:如果源節點的類型為 DOCUMENT、DOCUMENT_TYPE,則引發。 ”。

那么,您可以檢查一下soapPrincingRequest是否確實是一個DOCUMENT類型的節點(使用getNodeType() )?

如果是的話,我勸你投soapPrincingRequest作為一個Document ,然后訪問它的根NODEgetDocumentElement()並嘗試adopt()這個NODE ,而不是DOCUMENT之一。

XML API 在爭取正確性時總是有點難以使用,而Document與其root element之間的區別實際上很重要。 所以這有點痛苦,但我們最終到達了那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM