[英]how to add <soap:Envelope> and <soap:body> in xml request
[英]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)
我試圖將XmlDocument
添加為pricingWrapper
文本。 我是這樣做的:
pricingWrapper.addTextNode(createXmlProductFromDealingDocument(dealingFile));
但是,問題在於呈現為String
的XmlDocument
所有字符<
和>
都被addTextNode
方法addTextNode
。 換句話說,我可以看到我的身體有正確的內容,但是<
被替換為<
並且>
被替換為>
,因此使 SOAP 請求對目標服務無效。
我所做的另一個嘗試是從我的函數中返回一個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
,然后訪問它的根NODE
與getDocumentElement()
並嘗試adopt()
這個NODE
,而不是DOCUMENT
之一。
XML API 在爭取正確性時總是有點難以使用,而Document
與其root element
之間的區別實際上很重要。 所以這有點痛苦,但我們最終到達了那里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.