Сериализация Java-объектов в отношении XML-схемы, загруженной во время выполнения - PullRequest
2 голосов
/ 24 февраля 2010

Я называю XML-документ трехслойным , если его структура имеет следующую структуру: корневой элемент содержит несколько элементов контейнера (я буду называть их сущностями ), каждый из которых внутри них есть несколько элементов simpleType (я назову их properties ). Примерно так:

<data>
 <spaceship>
    <number>1024</number>
    <name>KTHX</name>
 </spaceship>
 <spaceship>
    <number>1624</number>
    <name>LEXX</name>
 </spaceship>
 <knife>
    <length>10</length>
 </knife>
</data>

, где spaceship - это сущность, а number - это свойство.

Моя проблема изложена ниже:

С учетом

schema: произвольный xsd-файл, описывающий трехслойный документ, загруженный во время выполнения. xmlDocument: XML-документ, соответствующий schema.

Создать

A Map<String, Map <String, Object>>, содержащий данные из xmlDocument, где первый ключ соответствует сущности, второй ключ соответствует свойству этой сущности, а значение соответствует значению этого свойства после приведения его к надлежащему типу Java (например, , если схема устанавливает значение свойства равным xs:int, тогда оно должно быть приведено к Integer).

Как проще всего добиться этого результата с существующими библиотеками?

P. С. JAXB на самом деле не вариант здесь. Схема может быть произвольной и неизвестной во время компиляции. Также я хочу избежать чрезмерного использования отражения (связанного с преобразованием бинов в карты). Я ищу что-то, что позволило бы мне делать типы, пока выполняется анализ xml.

Ответы [ 4 ]

2 голосов
/ 24 февраля 2010

Я думаю, XMLBeans стоит попробовать; спас день не раз ...

Обычно вы запускаете ant-скрипт для генерации bean-компонентов, обрабатывающих схему, а затем перебираете узлы для построения вашей карты.

1 голос
/ 24 февраля 2010

Вам понадобятся отражения, если схема неизвестна во время компиляции.

Я предлагаю взглянуть на некоторые другие инструменты , такие как xstream.

Я мог бы порекомендовать простой фреймворк или вы могли бы выполнить синтаксический анализ / запись xml с чистым dom4j, как Я сделал в проекте timefinder . Я использовал «чистый» подход, потому что в моем графе объектов были циклы, но я хотел, чтобы xml мог быть проверен с помощью схемы xml (и я не хотел использовать JAXB) * ​​1009 *

1 голос
/ 24 февраля 2010

Я думаю, JAXB (учебник здесь ) - самый простой способ сделать это.

Создайте свою структуру XML, например:

@XmlRootElement
class data {
 public List<SpaceShipType> spaceship;
 public KnifeType knife;
}

class SpaceShipType {
 public int number;
 public String name;
}

class KnifeType {
 public int length;
}

Затем создайте дерево объектов и используйте JAXB.marshall () для записи XML. Если у вас есть существующий XSD, используйте инструмент xjc для создания классов для вас.

0 голосов
/ 13 июня 2010

Я наконец-то начал использовать библиотеку Castor для анализа схемы и назначения типов данных вручную.

...