Преобразуйте Java-объекты в динамический XML - PullRequest
1 голос
/ 26 января 2011

Я работаю с динамическим форматом таблицы xml, состоящим из схемы, в которой указаны имена и типы столбцов, и тега значений, который содержит строки.Упрощенная версия xsd ниже:

<xs:complexType name="data">
    <xs:sequence>
        <xs:element name="schema" type="schema"/>
        <xs:element name="values" type="values"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="schema">
    <xs:anyAttribute/>
</xs:complexType>

<xs:complexType name="values">
    <xs:anyAttribute/>
</xs:complexType>

И сгенерированный им пример xml:

<data>
    <schema firstName="string" lastName="string" age="integer">
    <values>
        <value firstName="A" lastName="B" age="23"/>
        <value firstName="C" lastName="D" age="63"/>
        …
    </values>
</data>

Данные для генерации xml поступают из списка объектов данных, для нашего примера:

public class Person {
    private String firstName;
    private String lastName;
    private int age;

    // getters and setters…
}

В настоящее время я создаю его, добавляя такой код в класс (я использую jaxb для генерации xml):

private static QName FIRST_NAME = new QName("firstName");
private static QName LAST_NAME = new QName("lastName");
private static QName AGE = new QName("age");

private static Map<QName, String> schema;

static {
    schema = new HashMap<QName, String>();
    schema.put(FIRST_NAME, "string");
    schema.put(LAST_NAME, "string");
    schema.put(AGE, "integer"):
}

public Map<QName, String> asMap() {
    Map<QName, String> map = new HashMap<QName, String>();
    map.put(FIRST_NAME, firstName);
    map.put(LAST_NAME, lastName);
    map.put(AGE, Integer.toString(age)):
    return map;
}

public static Map<QName, String> getSchema() {
    return schema;
}

И затем делаю это для всех данныхобъект, который будет использоваться для генерации XML.Это работает, хотя я не чувствую, что это лучшее решение.Основная проблема, которую я вижу в этом, заключается в том, что между схемой и значениями нет связи, и если что-то меняется в одном из них, вам нужно помнить, чтобы обновить и другое.Также немного шумно добавлять это ко всем классам.

Может ли кто-нибудь предложить лучший (более чистый / более общий) способ сделать это?Может быть, какой-то хороший способ автоматически генерировать схемы и / или карты значений?Или любое другое предложение ...

(Вероятно, было бы лучше, если бы я мог получить что-то, что работало бы с любым Java-бином без изменения класса, но я в порядке с украшением / добавлением вещей в класс, еслинеобходимо.)

Спасибо

1 Ответ

2 голосов
/ 26 января 2011

Вся проблема в том, что таблица динамическая.Это должно быть?

Если нет, решение является простым, поскольку вы можете создать статическую таблицу и затем связать ее с компонентами Java с помощью JAXB.

Если она должна быть динамической, то единственное, что выможно связать статические экземпляры таблицы с Java-бинами, используя пользовательское связующее.Это означает, что если у вас есть статический экземпляр таблицы, который содержит firstName, lastName и age, то вы можете написать собственный связыватель, который будет генерировать Java-бины из этой таблицы, которые будут иметь правильные привязки (firstName, lastName и age), чточто ты сейчас делаешь вручную.Проблема этого подхода заключается в написании инструмента привязки.

Но при использовании готового программного обеспечения проще всего было бы не использовать динамическую таблицу, а вместо этого писать схемы для каждого экземпляра динамической таблицы.,Документы XML из этих схем будут по-прежнему соответствовать той, которая определяет динамическую таблицу, но это позволит вам использовать JAXB для автоматизации всего процесса генерации кода и синхронизации классов Java с документами XML.

...