2015-01-22 2 views
0

Camel версия 2,14 Smooks версия 1.5.1Использование Smooks или Groovy с Java Camel разделить/преобразования XML

Я получил сообщение, которое я хочу, чтобы разделить и преобразовать, но мне нужно идентификатор из родитель. Поэтому я подумал об использовании 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

Я не знаю о smooks, но вы можете комбинировать XSLT-трансформатор с разветвителем XPATH для этого.

Сначала преобразуйте данные в блоки, которые должны составлять каждое сообщение. Сделайте это с помощью XSLT, groovy или с тем, с чем вам удобно. Вот простая таблица стилей, которая должна быть помещена в src/main/resources (или в любое место в classpath).

<?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: сначала преобразование, то сплиттер. «Кому» может быть любым, как 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> 

+0

Я на самом деле имеют XSD схему результата. Тогда, может быть, самый простой способ - генерировать xsl из этой схемы и редактировать выборки? – J2B

0

В заводной это можно сделать так:

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 = [email protected]*.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 
Смежные вопросы