Преобразование атрибутов XML в теги (узлы) без использования XSLT в Java

У меня есть два 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.

Спасибо

что именно в xslt вы пытаетесь избежать?

MeBigFatGuy 02.05.2018 03:58

Я раньше не использовал xslt, но думаю, мне придется использовать имена атрибутов, поэтому я не могу сделать его универсальным процессом. Это верно? Я хочу написать утилиту, которая будет читать имена атрибутов и создавать дочерний узел для тега атрибута.

adbdkb 02.05.2018 04:16

Пожалуйста, покажите образцы ввода и желаемого результата. Ваше описание очень запутанное. Каждый XML имеет теги, поэтому, если единственное, что вы можете сказать нам об XML, - это то, что в нем есть теги, то мы действительно не очень многого знаем. Неудивительно, что все найденные вами примеры используют XSLT, потому что это лучший инструмент для работы; обращение к людям с просьбой о решении с использованием некачественных инструментов ограничит получаемые вами ответы.

Michael Kay 02.05.2018 09:03

@Michael Kay - я обновил вопрос, указав подробности входных данных и ожидаемого результата.

adbdkb 02.05.2018 15:01

Хотел бы узнать подробности / причины отрицательного голоса

adbdkb 02.05.2018 15:35

Я проголосовал против, потому что из-за отсутствия информации вопрос невозможно понять, но теперь вы исправили это, поэтому я отменил его. Ваша терминология все еще неверна (вы путаете «узлы» и «элементы»), но с примерами того, что вы на самом деле имеете в виду, мы справимся.

Michael Kay 02.05.2018 17:34

Спасибо за объяснение. Знание причины позволяет мне стараться не делать то же самое в будущем. Я могу изменить вопрос, заменив узлы элементами, не могли бы вы объяснить разницу? Является ли узел всем деревом / поддеревом, а элемент - самым низким тегом, имеющим значение?

adbdkb 02.05.2018 20:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
169
1

Ответы 1

Боюсь, у меня нет времени и терпения, чтобы сделать решение с использованием интерфейсов 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>

Другие вопросы по теме