Design Paradigm для создания объекта из файла XML - PullRequest
2 голосов
/ 21 августа 2011

Для универсального задания я пишу Java-программу, которая должна сохранять и загружать иерархию объектов в XML-файлы.Например, программа создает класс Zoo со списком подклассов Animals, сохраняет его в XML и загружается снова при следующем запуске программы пользователем.

Файл может выглядеть как

<Zoo>
    <Animals>
        <Lion>
            <name>Leo</name>
            <age>5</age>
            <roar>fearsome</roar>
        </Lion>
        <Elephant>
            <name>Dumbo</name>
            <age>10</age>
            <ears>let him fly</ears>
        </Elephant>
    </Animals>
</Zoo>

Существует небольшое конечное количество подклассов Animal, которое мне нужно поддерживать (~ 5).Каждый подкласс животного имеет индивидуальные атрибуты (например, уши и рев).Я запутался в том, что лучший шаблон проектирования для создания объектов и создания файлов.

В настоящее время у меня есть класс XMLCreator с такими методами, как void createZooElement(Zoo), void createLionElement(Lion) и т. Д. И т. Д.,и класс XMLReader с private Zoo createZoo(File), private Lion createLionObject(Element).

Является ли это хорошим способом, если вы ожидаете, что этот код будет поддерживаться другими в будущем?Или каждый объект должен иметь метод конструктора, который принимает File / Element в качестве параметра, и другой метод, который возвращает File / XMLElement?Каким способом достигается наибольшая инкапсуляция / ремонтопригодность?

Ответы [ 5 ]

9 голосов
/ 21 августа 2011

Я бы просто использовал JAXB , который позволяет маршалировать дерево объектов (аннотированных классов) в XML и демаршировать XML в дерево объектов. Существуют и другие API-интерфейсы Object to XML, но JAXB поставляется с Java SE и хорошо работает.

2 голосов
/ 28 сентября 2012

Используя XStream , вы можете сериализовать большинство объектов Java без какого-либо сопоставления .Имена объектов становятся именами элементов в создаваемом XML, а строки в классах образуют содержимое элементов XML.Классы, которые вы сериализуете с помощью XStream, не должны реализовывать интерфейс Serializable.XStream - это инструмент сериализации, а не инструмент привязки данных, что означает, что он не выполняет генерацию классов из файла XML или определения схемы XML (XSD)

1 голос
/ 21 августа 2011

По-моему, вам нужен либо шаблон Builder, либо шаблон Factory. Проверьте Википедию для более подробной информации. Я бы пошел с шаблоном Factory, потому что я более знаком с ним. Вместо того, чтобы назвать это XMLCreator, я бы назвал это AnimalFactory:

public class AnimalFactory () {
    private static final AnimalFactory instance = new AnimalFactory ();

    // I make this private so that I can be sure there is only one instance
    // of the object. This is another pattern, the `Singleton`
    private AnimalFactory () {};

    // This is how you would access the instance
    public static AnimalFactory getInstance () { return instance; }

    // This is where you create the animal instances.
    public Lion getLion () {...}
    public Elephant getElephant () {...}
}
0 голосов
/ 21 августа 2011

Много хороших вариантов здесь.Для привязки данных XML.

XMLBean требуется схема XML.

JiBX , castor , требуется файл сопоставления.

0 голосов
/ 21 августа 2011

Вам нужно SAXParser с ContentHandler .

Вам нужно будет реализовать startElement ... endElement ... и несколько других.

Вы можете изменить свою стратегию синтаксического анализа, читая элемент в методах startElement.

Это должно быть легко, я считаю.

Эту статью стоит прочитать.


Кроме того, если вы продолжите создавать такие методы, как void createZooElement(Zoo), в конце дня вы получите неуправляемые сотни методов.

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