【问题标题】:How to add raw XML text to SOAPBody element如何将原始 XML 文本添加到 SOAPBody 元素
【发布时间】:2015-04-29 22:04:26
【问题描述】:

我有一个由应用程序生成的 XML 文本,我需要在它周围包裹一个 SOAP 信封,然后再进行 Web 服务调用。

以下代码构建了信封,但我不知道如何将现有 XML 数据添加到 SOAPBody 元素中。

    String rawXml = "<some-data><some-data-item>1</some-data-item></some-data>";

    // Start the API
    MessageFactory mf = MessageFactory.newInstance();
    SOAPMessage request = mf.createMessage();
    SOAPPart part = request.getSOAPPart();
    SOAPEnvelope env = part.getEnvelope();

    // Get the body. How do I add the raw xml directly into the body?
    SOAPBody body = env.getBody();

我尝试过body.addTextNode(),但它添加了内容,所以&lt; 和其他人被转义了。

【问题讨论】:

  • body.appendChild(document.createTextNode(rawXml)); 怎么样?我没有尝试过,但在文档中我看到SOAPBody 继承自 DOM 元素,因此可以工作;)document 是一个 DOM 文档对象。
  • @rzysia 那很接近。执行此操作时出现 WRONG_DOCUMENT_ERR 异常,但随后 body.addDocument(document); 成功了 =)。我会发布完整的代码。

标签: java xml


【解决方案1】:

以下将 XML 添加为文档:

Document document = convertStringToDocument(rawXml);
body.addDocument(document);

文档创建:

private static Document convertStringToDocument(String xmlStr) {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder;
    try {
        builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new InputSource(new StringReader(xmlStr)));
        return doc;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

我从this post 中获取了convertStringToDocument() 逻辑。

【讨论】:

  • 如果你有异常 - Exception in thread "main" org.w3c.dom.DOMException: NAMESPACE_ERR 你可以通过设置factory.setNamespaceAware(true);来解决它
  • 这些命名空间应该加上:import org.w3c.dom.Document;导入 org.xml.sax.InputSource;导入 javax.xml.parsers.DocumentBuilder;导入 javax.xml.parsers.DocumentBuilderFactory;导入 java.io.StringReader;
【解决方案2】:

您需要告诉 XML 序列化器不要将 SOAPBody 内容解析和转义为 XML。您可以通过将 XML 包含在 &lt;![CDATA[]]&gt;

中来做到这一点
    String rawXml = "<![CDATA[<some-data><some-data-item>1</some-data-item></some-data>]]>";

    // Start the API
    MessageFactory mf = MessageFactory.newInstance();
    SOAPMessage request = mf.createMessage();
    SOAPPart part = request.getSOAPPart();
    SOAPEnvelope env = part.getEnvelope();

    // Get the body. How do I add the raw xml directly into the body?
    SOAPBody body = env.getBody();

    SOAPElement se = body.addTextNode(rawXml);

    System.out.println(body.getTextContent());

编辑

<some-data><some-data-item>1</some-data-item></some-data>

这是

的输出
System.out.println(body.getTextContent());

【讨论】:

  • 它解决了字符转义,但是&lt;![CDATA[]]&gt;也被序列化程序添加了。我不确定我们的客户服务器是否会安全地解释它。
  • 当数据作为文本内容检索时将被忽略。之后,客户服务器必须对其进行解析以将其读取为 XML。
最近更新 更多