Преобразование одного формата XML в другой формат XML с использованием JAXB в Apache Camel Route без использования XSLT

У меня есть запрос xml, который используется целевой системой. Целевая система принимает XML, но формат отличается. Поэтому мне нужно построить логику маршала и демаршала, чтобы данные шли по моему маршруту в целевую систему. Итак, есть ли способ, которым я могу добиться использования подхода Java bean или jAXB без использования dozer или XSLT?

Верблюд Apache с Springboot


person Singh Amita    schedule 11.06.2019    source источник
comment
Я предполагаю, что вы могли бы иметь два класса с соответствующими аннотациями JAXB SourceClass и TargetClass и отображать данные из одного класса в другой как метод SourceClass, такой как TargetClass sourceObject.toTargetClass(), или определить класс, который реализует интерфейс TypeConverters, и зарегистрировать его в Camel Context. Однако, если я сопоставляю XML с XML, я всегда использую XSLT2, так как он очень гибкий и экономичный с кодом.   -  person Screwtape    schedule 11.06.2019
comment
XSLT будет проще и гибче, чем использование сопоставления pojo для pojo.   -  person Namphibian    schedule 12.06.2019
comment
@Screwtape Спасибо !!! Не могли бы вы привести какой-нибудь пример для того же   -  person Singh Amita    schedule 17.06.2019


Ответы (1)


Вот очень быстрый и простой способ преобразования XSLT.

Предполагая, что ваши исходные данные выглядят так:

<?xml version="1.0"?>
<root>
  <elem1 id="1">
    <child1>Hello</child1>
    <child2>World</child2>
  </elem1>
</root>

у вас может быть XSLT-файл преобразования, который выглядит примерно так:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="elem1">
    <div>
      <h1>Section <xsl:value-of select="@id" /></h1>
      <p><xsl:value-of select="child1" /></p>
      <p><xsl:value-of select="child2" /></p>
    </div>
  </xsl:template>
  <xsl:template match="@*|node()"> <!-- identity transform -->
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

поэтому вы затем передаете это через преобразование xslt верблюда, например, так или иначе

from("direct:start")
  .to("xslt:myTransformFile.xsl&saxon=true")
  .to("direct:end")

затем вы должны получить следующее XML-сообщение, передаваемое в direct:end:

<?xml version="1.0"?>
<root>
  <div>
    <h1>Section 1</h1>
    <p>Hello</p>
    <p>World</p>
  </div>
</root>

поскольку шаблон удостоверения скопировал все элементы, не соответствующие другому шаблону, и шаблон заменяет любой элемент, соответствующий критериям выбора, содержимым шаблона. В этом случае elem1 заменяется содержимым шаблона. Элементы <xsl:value-of ... /> интерпретируются, но любой элемент, который не начинается с <xsl:..., является лишь частью вывода.

Простое введение в XSLT можно найти здесь: https://www.w3schools.com/xml/xsl_intro.asp.

person Screwtape    schedule 19.06.2019
comment
Я попробую этот вариант, и, надеюсь, он должен работать. - person Singh Amita; 24.06.2019
comment
это на самом деле помогло мне понять, как работает преобразование xslt.. спасибо - person Singh Amita; 21.08.2019