【问题标题】:Getting Raw XML From SOAPBody in Java (for a camel flow?)从 Java 中的 SOAPBody 获取原始 XML(对于骆驼流?)
【发布时间】:2012-11-03 10:35:24
【问题描述】:
如何从 SOAPBody 获取原始 xml?也许一些实用函数只会给我 Body xml(不是正文)。我不想重新发明代码来遍历每个节点/子节点 - 它可能已经存在于某些实用程序中?
Camel 流有一个数据转换器“soapjxb”,但我不需要映射/解组到 java 对象。
我为什么需要它?:清理操作
其中一个客户端应用程序(我正在尝试使用 ApacheCamel 集成)正在向我的 mq 发送一条 xml 消息,该消息嵌入在一个肥皂信封中(“不必要的噪音”),我无法更改客户端应用程序。我只需要丢弃肥皂信封并在肥皂体内取出 xml 并将其发布到另一个 jmsqueue。
PS:
我知道如何从 SOAPMessage 获取原始 xml,如下所述:Getting Raw XML From SOAPMessage in Java
【问题讨论】:
标签:
java
soap
apache-camel
【解决方案1】:
如果您有 XML 中的 SOAPEnvelope,那么只需使用 xpath 来隔离您想要的 XML 并将其发送出去...
.setBody(xpath("//SOAPBody"))...
【讨论】:
-
已尝试与上述等效的 xml://SOAPBody 我得到的错误:交付尝试:5 捕获:org.apache.camel.RuntimeCamelException: org .apache.camel.NoTypeConversionAvailableException:没有可用于从类型 org.apache.xml.dtm.ref.DTMNodeList 转换为所需类型的类型转换器:具有值 org.apache.xml.dtm.ref 的 org.w3c.dom.Document .DTMNodeList@1ace672
【解决方案2】:
使用 xslt 删除命名空间并作为普通 xml 对待。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope /"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /><xsl:template match=""><xsl:element name="{local-name()}" ><xsl:apply-templates select="@ | node()" /></xsl:element></xsl:template><xsl:template match="@*"> <xsl:attribute name="{local-name()} "> <xsl:value-of select="." /></xsl:attribute></xsl:template><xsl:template match="text() | comment() | processing-instruction()"> <xsl:copy /> </xsl:template></xsl:stylesheet>
将 > 替换为大于,将 < 替换为小于 ans 保存为 xslt 并用于转换以删除肥皂命名空间。