Динамическое создание классов Java из документа XML - PullRequest
4 голосов
/ 08 мая 2009

Рассмотрим следующий сценарий: у меня есть XML-файл person.xml со следующими данными:

<person>
    <name>MrFoo</name>
    <age>28</age>
</person>

Если я хочу прочитать этот XML в объект Java, я бы создал Java-бин с именем PersonBean (с методами получения / установки для атрибутов) как:

class Person{
    String name;
    int age;
}

И я мог бы использовать любые API для чтения XML и заполнения Java Bean.

Но реальный вопрос здесь заключается в том, предположим, что если структура XML-файла изменится, то есть, если в XML-файл добавлен новый атрибут «email», тогда мне придется изменить Java Bean, чтобы добавить новый атрибут. Но я хочу избежать изменения кода Java, даже если структура XML меняется.

Итак, я пытаюсь создать еще один XML-файл под названием PersonStructure.xml с содержимым:

<class name="Person">
  <attributes>
      <attribute>
          <name>personName</name>
          <type>java.lang.String</type>
      </attribute>
      ... and it goes like this...
   </attribute>
</class>

Можно ли прочитать файл PersonStructure.XML и преобразовать его в файл класса Person.Java? Подход, который я пытаюсь сделать, правильный, или есть другой способ сделать то же самое?

Ответы [ 4 ]

7 голосов
/ 08 мая 2009

Хотя это не совсем то, что вы пытаетесь сделать, вы должны взглянуть на JAXB. Он может генерировать набор классов Java из определения схемы. Ваш файл PersonStructure.xml немного похож на XSD с другим синтаксисом, поэтому вы можете повторно использовать JAXB.

https://jaxb.dev.java.net/

4 голосов
/ 08 мая 2009

Не очень хорошо знаком с Java (я в основном .NET парень), но здравый смысл применим: на самом деле очень мало пользы в динамически генерируемых bean-компонентах (если вы не будете связывать их с каким-либо элементом управления, в этом случае массив Object с будет хорошо).

Что более логично, так это кодировать Java-бины из этих определений XML, что можно сделать с помощью XSLT .

PS. Не пытайтесь сделать язык программирования из XML. Ад, безусловно, вырвется на свободу, если вы сделаете это.

0 голосов
/ 19 апреля 2013

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

Иллюстрируя, используя ваш пример, вместо этого:

Person person = getPersonFromSomewhere();
System.out.printf("%s was %d years old\n", person.name, person.age);
person.age++; // happy birthday!

... вы бы сделали это:

Map<String, Object> person = getPersonFromSomewhere();
System.out.printf("%s was %d years old\n", person.get("name"), person.get("age"));
int currentAge = (Integer) person.get("age"); // real code would sanitise the value first
person.put("age", currentAge + 1); // happy birthday!

Да, это означает больше кода и меньше проверки на ошибки (компилятор не скажет вам, если вы неправильно написали 'name', и нет проверки типов), но он будет делать то, что вы хотите. И, учитывая, что передовой практикой является кодирование получателей и установщиков, а не прямой доступ к полям членов, в реальной жизни вы все равно будете писать больше кода.

Если вы решите пойти по этому пути, обратитесь к к этому вопросу , чтобы узнать, как конвертировать в / из XML.

0 голосов
/ 21 января 2010

Я как-то более или менее сталкиваюсь с той же проблемой (мне нужно преобразовать данные в Java в файл POM.xml), одна из вещей, которая не работала для меня, но, возможно, могла бы работать для вас, была XStream библиотека, она превращает Java-классы в XML, вы должны взглянуть:

http://x -stream.github.io /

Я в любом случае связан с ними, просто случайный парень, который ищет свои ответы. Если у вас есть какие-либо вопросы о том, как использовать эту библиотеку, попробуйте связаться с ними. Надеюсь, это решит вашу проблему.

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