парсинг XML сообщение с использованием SPEL - PullRequest
1 голос
/ 09 апреля 2020

В моем конвейере Spring Integration я получаю полезную нагрузку XML и в зависимости от значения атрибутов в XML мне нужно сгенерировать ключ и опубликовать sh его в kafka.

return IntegrationFlows.from(Kafka.messageDrivenChannelAdapter(kafkaListenerContainer))
                .wireTap(ACARS_WIRE_TAP_CHNL) // Log the raw message
                .enrichHeaders(h ->h.headerFunction(KafkaHeaders.MESSAGE_KEY, m -> {
                        StringBuilder header = new StringBuilder();
                        Expression expression = new SpelExpressionParser().parseExpression("payload.Body.toString()");
                        //Expression expression = new SpelExpressionParser().parseExpression("m.payload.Body.ACIFlight.fltNbr.toString()");
                        String flightNbr = expression.getValue(String.class);
                        header.append(flightNbr);
                        return header.toString();
                })) 
                .get();

XMl is

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://www.exmaple.com/FlightLeg">
    <ns0:Header>
        <ns1:eventHeader xmlns:ns1="http://www.exmaple.com/header" eventID="659" eventName="FlightLegEvent" version="1.0.0">
            <ns1:eventSubType>FlightLeg</ns1:eventSubType>
        </ns1:eventHeader>
    </ns0:Header>
    <ns0:Body>
        <ns1:ACIFlight xmlns:ns1="http://ual.com/cep/aero/ACIFlight">
            <flightKey>1267:07042020:UA</flightKey>
            <fltNbr>1267</fltNbr>
            <fltLastLegDepDt>07042020</fltLastLegDepDt>
            <carrCd>UA</carrCd>
        </ns1:ACIFlight>
    </ns0:Body>
</ns0:Envelope>

Я пытаюсь получить fltNbr из этой xml полезной нагрузки, используя spel. Пожалуйста, предложите

Обновлено

String flight = XPathUtils.evaluate(message.getPayload(), "/*[local-name() = 'fltNbr']",XPathUtils.STRING);
String DepDate = XPathUtils.evaluate(message.getPayload(), "/*[local-name() = 'fltLastLegDepDt']",XPathUtils.STRING);
return MessageBuilder.fromMessage(message).setHeader("key", flight+DepDate).build();

1 Ответ

0 голосов
/ 09 апреля 2020

Вы можете использовать XPath Header Enricher .

XPath также доступен в качестве функции Spel, но в этом случае лучше использовать Enricher.

public class XPathHeaderEnricher extends HeaderEnricher {

Вот контрольный пример ...

    @Test
    public void convertedEvaluation() {
        Map<String, XPathExpressionEvaluatingHeaderValueMessageProcessor> expressionMap =
                new HashMap<String, XPathExpressionEvaluatingHeaderValueMessageProcessor>();
        XPathExpressionEvaluatingHeaderValueMessageProcessor processor = new XPathExpressionEvaluatingHeaderValueMessageProcessor(
                "/root/elementOne");
        processor.setHeaderType(TimeZone.class);
        expressionMap.put("one", processor);
        String docAsString = "<root><elementOne>America/New_York</elementOne></root>";
        XPathHeaderEnricher enricher = new XPathHeaderEnricher(expressionMap);
        Message<?> result = enricher.transform(MessageBuilder.withPayload(docAsString).build());
        MessageHeaders headers = result.getHeaders();
        assertThat(headers.get("one")).as("Wrong value for element one expression")
                .isEqualTo(TimeZone.getTimeZone("America/New_York"));
    }
...