Преобразование атрибутов XML в теги (узлы) без использования XSLT в Java - PullRequest
0 голосов
/ 02 мая 2018

У меня есть два XML-файла: у одного есть теги, а у другого - теги в качестве атрибутов и значений. Мне нужно объединить два xmls. Мне нужно сделать это с помощью Java без использования xslt. У меня будут разные пары xmls, которые мне нужно будет объединить, поэтому я хочу написать общую программу для этого. Как мне это сделать? Все примеры, которые я нашел, используют XSLT.

Обновление: добавлен пример

Пример ввода 1 - XML ​​в виде узлов

<PROPERTIES>
    <PROPERTY>
        <ADDRESS>
            <AddressLineText></AddressLineText>
            <CityName></CityName>
            <PostalCode></PostalCode>
            <StateCode></StateCode>
        </ADDRESS>
    </PROPERTY>
</PROPERTIES>

Пример ввода 2 - XML ​​как атрибуты

    <DocData DescriptorID="95" Value="70056" Name="PostalCode"/>
    <DocData DescriptorID="81" Value="LA" Name="StateCode"/>
    <DocData DescriptorID="15" Value="GRETNA" Name="CityName"/>
    <DocData DescriptorID="49" Value="721 SAMPLE DR" Name="AddressLineText"/>

Пример ожидаемого выхода

<PROPERTIES>
    <PROPERTY>
        <ADDRESS>
            <AddressLineText>721 SAMPLE DR</AddressLineText>
            <CityName>GRETNA</CityName>
            <PostalCode>70056</PostalCode>
            <StateCode>LA</StateCode>
        </ADDRESS>
    </PROPERTY>
</PROPERTIES>

Что я хочу сделать, - объединить два вышеупомянутых XML-файла и обновить значения из атрибутов как текстовые значения для соответствующих узлов. Для этого я решил сначала преобразовать XML с атрибутами в XML с узлами, а затем попробовать выполнить слияние.

Если у вас есть другие предложения, я бы хотел попробовать это.

Поскольку информация тегов не одинакова во всех парах, для которых мне нужно это сделать, я хочу избегать xsl.

Спасибо

1 Ответ

0 голосов
/ 02 мая 2018

Боюсь, у меня нет времени и терпения для решения с использованием интерфейсов Java DOM, но вот решение XSLT на случай, если вы передумали.

<xsl:transform xmlns="http://www.w3.org/1999/XSL/Transform"
  version="3.0" expand-text="yes">
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="*[not(child::node())]">
     <xsl:copy>{doc('doc2.xml')//DocData[@Name=name(current())]/@Value}</xsl:copy>
  </xsl:template>
</xsl:transform>
...