JAVA: создание XML-документа с использованием выражений XPath - PullRequest
8 голосов
/ 21 ноября 2008

Я знаю, что на самом деле это не то, для чего нужен XPath, но если у меня есть HashMap выражений XPath со значениями, как мне поступить при создании документа XML. Я нашел дом-4j DocumentHelper.makeElement (branch, xpath) за исключением того, что он не способен создавать атрибуты или индексировать. Конечно, есть библиотека, которая может это сделать?

Map xMap = new HashMap();

xMap.put("root/entity/@att", "fooattrib");
xMap.put("root/array[0]/ele/@att", "barattrib");
xMap.put("root/array[0]/ele", "barelement");
xMap.put("root/array[1]/ele", "zoobelement");

приведет к:

<root>
<entity att="fooattrib"/>
<array><ele att="barattrib">barelement</ele></array>
<array><ele>zoobelement</ele></array>
</root>

Ответы [ 3 ]

2 голосов
/ 21 июня 2012

Лучшее, что я смог придумать, это использовать реализацию JAXB, которая будет маршалировать / демаршировать объекты в xml, а затем я использовал Dozer (http://dozer.sourceforge.net/documentation/mapbackedproperty.html), чтобы отобразить xpath, которые были ключами в карте, в объект JAXB методы установки.

<mapping type="one-way" map-id="TC1">
<class-a>java.util.Map</class-a>
<class-b>org.example.Foo</class-b>
<field>
  <a key="root/entity/@att">this</a>
  <b>Foo.entity.att</b>
  <a-hint>java.lang.String</a-hint>
</field>

Это скорее двухэтапное решение, но оно действительно сработало для меня.

2 голосов
/ 28 августа 2013

Я также хотел такого же рода требования, когда природа настолько динамична и не хочет использовать XSLT или какие-либо фреймворки для отображения объектов, поэтому я реализовал этот код в Java и написал в нем блог, пожалуйста, посетите

http://ganesh -kandisa.blogspot.com / 2013/08 / динамического XML-преобразование-в-java.html

или код ветвления в репозитории git,

https://github.com/TheGanesh/DynamicXMLTransformer

2 голосов
/ 24 ноября 2008

Несколько лет назад я искал нечто подобное - что-то вроде записываемого XPath. В конце концов, ничего не найдя, я взломал что-то, что по сути создавало XML-документ, добавляя новые узлы в выражения parent :

parent="/" element="root"
parent="/root" element="entity"
parent="/root/entity" attribute="att" value="fooattrib"
parent="/root" element="array"
parent="/root" element="ele" text="barelement"

(Это должно было управляться файлом конфигурации XML, отсюда и внешний вид выше.)

Было бы заманчиво попробовать автоматизировать кое-что из этого, чтобы просто взять последний элемент пути и что-то из него сделать, но я всегда чувствовал, что есть выражения XPath, которые я могу написать, и такой тупой подход может быть неправильным. 1008 *

Другой подход, который я рассмотрел, хотя и не реализовал (вышеизложенное было «достаточно хорошо»), заключался в использовании превосходного Jaxen для генерации элементов, которые не существовали, на лету, если они еще не существовали.

Из Jaxen FAQ :

Требуется только реализация интерфейса org.jaxen.Navigator. Не весь интерфейс требуется, и также предоставляется реализация по умолчанию в форме org.jaxen.DefaultNavigator.

DOMWriterNavigator обернет и существующий DOMNavigator, а затем будет использовать метод makeElement, если элемент не существует. Однако даже при таком подходе вам, вероятно, придется выполнить некоторую предварительную / последующую обработку запроса XPath для таких функций, как attributes и text() функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...