2009-05-08 5 views
3

Рассмотрите этот сценарий: у меня есть XML-файл с именем person.xml со следующими данными.Динамическое создание классов Java из 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? Подход, который я пытаюсь сделать, правильный или есть другой способ сделать то же самое?

+0

один второстепенный вопрос, что бы ваш код java сделал ваш новый измененный объект? Вам не нужно будет адаптировать свой бизнес-код, чтобы использовать новую версию боба? –

+0

Правильно ли указано название вашего вопроса? Похоже, вы хотите создавать Java-объекты, а не классы Java. – skaffman

+0

Я хочу создать структуру класса Java из файла XML. :) – Veera

ответ

7

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

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

+0

Вы также можете использовать XMLBeans, который почти аналогичен JAXB http://xmlbeans.apache.org/ – HaBaLeS

4

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

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

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

0

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

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

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

0

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

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

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! 

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

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

Смежные вопросы