Как создать объекты Java из тегов XML, которые ссылаются друг на друга? - PullRequest
5 голосов
/ 02 декабря 2011

У меня есть XML, в котором есть теги, соответствующие трем типам объектов Java, которые будут созданы из XML.Объекты имеют вид:

A
- static Map<String, A>
- String name
- String aInfo1
- String aInfo2

B
- static Map<String, B>
- String name
- String bInfo1
- String bInfo2

C
- A aObject
- B bObject

Теперь в моем XML я определяю список тегов для объектов A и B, а затем определяю теги для объектов C, которые ссылаются на объекты A и B, используятам имя поля.У меня есть два требования:

  1. заполнять статические карты в A и B при чтении объектов A и B из XML.Карты будут содержать отображение A.name в A и B.name в B. соответственно.
  2. заполнение объектов C путем считывания A.name и B.name из тега XML и последующего использования карт, определенных вОбъекты A и B.

Я читал о некоторых средах Java, таких как JAXB, но я не могу придумать способ создания объектов такого типа из моего XML.Есть ли в Java фреймворк, который может сделать это из коробки или с минимальной логикой?

Редактировать:

Есть еще одно требование: мне нужно определить D и E объектыform

D
- Map<A, E>

Я бы определил объекты E подобно тому, как сервлеты определены в web.xml, т.е. сначала определил имя и класс для класса E, а затем использовал бы имя для E в другом месте.Кроме того, передайте параметры для создания экземпляров объектов E.Тег будет выглядеть так:

<E>
    <name>queryProcessor</name>
    <class>com.mydomain.QueryProcessor</class>
</E>

Теперь это будет использоваться при определении содержимого Map в D

<D>
    <map>
        <A>name_of_some_A_object</A>
        <E name="queryProcessor">
            <param1>name_of_some_B_object</param1>
            <param2>name_of_some_B_object</param2>
        </E>
        <A>name_of_some_A_object</A>
        <E name="queryProcessor">
            <param1>name_of_some_B_object</param1>
            <param2>name_of_some_B_object</param2>
        </E>
     </map>
 </D>

По сути, карта в D будет заполняться путем создания экземпляра класса baseтип E с параметрами, переданными ему, и объект A, обозначаемый его именем.

Ответы [ 3 ]

3 голосов
/ 02 декабря 2011
  • Укажите правильный формат XML с помощью XSD
  • Генерация классов JAXB

(Вы могли бы сделать это и наоборот, если вы знакомы с аннотациями JAXB и хотите управлять интерфейсом с Java, а не с XSD).

Примечание: статические Карты, скорее всего, не то, что вы хотите использовать. Если вы объясните больше о том, какую проблему вы хотите решить, мы можем указать вам несколько альтернативных способов

Edit:

Вы говорите о формате XML? Или зачем мне вообще нужен XML? Мне нужен XML для возможности настраивать мои приложения вне Java.

Похоже, вы заново изобретаете колесо. Посмотрите на Spring и посмотрите, подходит ли он вам. Если это не так, объясните почему.

1 голос
/ 07 декабря 2011

Может быть, вы хотите взглянуть на XStream: http://x -stream.github.io /

Это хорошая библиотека для маршалирования и демаршализации объектов в XML и из XML, и больше ничего не делает (в отличие от Spring). Как пример в http://x -stream.github.io / tutorial.html , Вы можете загружать объекты из XML так же просто, как:

Person newJoe = (Person)xstream.fromXML(xml);

Чтобы XStream мог понять ваш XML, вам нужно настроить псевдоним, например, http://x -stream.github.io / alias-tutorial.html .

Один только XStream не сможет полностью решить вашу проблему, в основном из-за двух статических карт. Однако вы можете позволить XStream загружать списки As и B из XML, а затем строить две карты из списка.

Для объекта C, ссылающегося на A и B, вы можете прочитать следующий учебник, в котором рассказывается о ссылке на объект: http://x -stream.github.io / graphs.html . Если это не соответствует вашим потребностям, вы всегда можете легко создать другой класс для чтения необходимой информации из XML с помощью XStream, например

public class CInfo {
    public String aName;
    public String bName
}

И создавать экземпляры C, используя CInfo. Если у вас уже есть имя для карты экземпляров A и B, это будет тривиально.

1 голос
/ 06 декабря 2011

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

Документация Spring Core , вероятно, достаточно для начала работы. Примером XML будет

<bean id="beanOneId" class="the.bean.Class">
    <property name="someProperty" value="staticValue">
    <property name="someOtherProperty" ref="beanTwoId">
</bean>
<bean id="beanTwoId" class="the.otherbean.Class">
    <property name="someOtherProperty" ref="beanOneId">
    <property name="someOtherProperty" ref="beanThreeId">
</bean>

Но то, что вы описываете, не должно быть слишком сложным с отражением. Предполагая, что ни один из других объектов не нуждается в ссылке в конструкторе (а скорее как setX), я бы начал с сканирования xml, создания и сохранения всех объектов с их именами и запоминания списка «соединений», так что делайте это. После создания всех объектов выполните все подключения в списке подключений.

...