Camel版本2.14 Smooks版本1.5.1
我收到了一条想要拆分和转换的消息,但我需要来自父级的 id 。所以我考虑使用Smooks,拆分消息,转换并将每个输出发送到队列。这将使用freemarker模板进行转换。
<!-- Message -->
<data>
<id>123</id> <!-- This is needed in both portal messages -->
<portals>
<portal id="1" />
<portal id="2" />
</portals
</data>
<!-- Msg 1 -->
<portal dataId="123">
<id>1</id>
<portal>
<!-- Msg 2 -->
<portal dataId="123">
<id>2</id>
<portal>
有很多例子。但是,例如,由于“java.lang.ClassNotFoundException:org.apache.camel.component.ResourceBasedComponent”这是一个已知问题,因此驼峰示例不起作用。
另一种方法是使用 groovy 进行转换?
那么,这最容易解决的方法是什么?
答案 0 :(得分:0)
我不知道smooks,但您可以将XSLT转换器与XPATH分离器结合使用。
首先,将数据转换为应构成每条消息的块。使用XSLT,groovy或任何你觉得舒服的东西。这是一个简单的样式表,放在src / main / resources(或任何类路径位置)中。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<portals>
<xsl:variable name="dataId" select="/data/id"/>
<xsl:for-each select="/data/portals/portal">
<portal dataId="$dataId">
<xsl:attribute name="dataId">
<xsl:value-of select="/data/id"/>
</xsl:attribute>
<id><xsl:value-of select="@id"/></id>
</portal>
</xsl:for-each>
</portals>
</xsl:template>
Camel路线:首先是变换,然后是分离器。 &#34;到&#34;可以是任何东西,比如seda / direct用于进一步处理或目标协议。
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:data"/>
<to uri="xslt:transform.xslt"/>
<split>
<xpath>portals/portal</xpath>
<to uri="log:foo.bar?level=INFO"/>
</split>
</route>
答案 1 :(得分:0)
在groovy中可以这样做:
import groovy.util.XmlSlurper
import groovy.xml.MarkupBuilder
def xml = """
<data>
<id>123</id>
<portals>
<portal id="1" />
<portal id="2" />
</portals>
</data>
"""
def slurped = new XmlSlurper().parseText(xml)
def msgId = slurped.id
def portalIds = slurped.portals.portal.@id*.text()
def portalXmls = portalIds.collect { portalId ->
writer = new StringWriter()
portalXml = new MarkupBuilder(writer)
portalXml.doubleQuotes = true
portalXml.portal(dataId: msgId) {
id(portalId)
}
writer
}.each { println it.toString() }
null