【问题标题】:Using Smooks or Groovy with Java Camel to split/transform XML使用 Smooks 或 Groovy 和 Java Camel 来拆分/转换 XML
【发布时间】:2015-01-22 09:42:40
【问题描述】:

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

那么,如何解决这个最简单的问题呢?

【问题讨论】:

    标签: groovy apache-camel smooks


    【解决方案1】:

    我不知道 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>
    

    骆驼路线:首先是变换,然后是分离器。 “to”可以是任何东西,例如用于进一步处理的 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>
    

    【讨论】:

    • 我实际上有一个结果的 xsd 模式。那么也许最简单的方法是从该模式生成 xsl 并编辑选择?
    【解决方案2】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多