使用Smooks或Groovy与Java Camel分割/转换XML

时间:2015-01-22 09:42:40

标签: groovy apache-camel smooks

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 进行转换?

那么,这最容易解决的方法是什么?

2 个答案:

答案 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