Как бы вы создали XML-файлы в Java - PullRequest
2 голосов
/ 16 июля 2009

Я создаю программное обеспечение для создания документов (точнее, байесовских сетевых графиков), и эти документы необходимо сохранять в формате XML.

Я знаю, как создавать файлы XML, но мне еще предстоит решить, как организовать код.

В настоящее время я планирую, чтобы каждый объект (то есть вершина или ребро) имел функцию getXML () (они, вероятно, реализуют интерфейс, чтобы его можно было позже развернуть). getXML () вернет строку, содержащую XML для этого объекта.

Будет еще один объект, который соберет все эти строки XML, соединит их и выведет файл XML.

По некоторым причинам, я думаю, что это выглядит немного грязно, как бы вы порекомендовали это сделать?

Ответы [ 7 ]

3 голосов
/ 16 июля 2009

Модель (вершина / ребро) не должна зависеть от представления (XML):

Model model = new Model();
View view = model.getView(); // wrong

правильный способ состоит в том, чтобы отделить модель от вида (с чем-то вроде XStream или чего-либо еще) или просто сделать вид в сочетании с моделью:

Model model = new Model();
View view = new XMLView(model); // ok
1 голос
/ 16 июля 2009

Вам нужно использовать Java ? Scala содержит неявные преобразования типов, которые позволяют вам неявно преобразовывать объект модели в представление представления по вашему выбору. Это также полностью совместимо с Java. Например:

def printData(obj: DataObject, os: OutputStream) = {

   val view: ViewRepresentation = obj //note implicit conversion
   view.printTo(os)
}

Где у вас есть trait (т. Е. interface)

trait ViewRepresentation { 
  def printTo(os: OutputStream)
}

И неявное преобразование:

implicit def dataobj2xmlviewrep(obj: DataObject): ViewRepresentation = {
  new XmlViewRepresentation(obj)   
}

Вам просто нужно кодировать сделанное на заказ представление XML. Ах, да - и он имеет собственную поддержку XML на языке

1 голос
/ 16 июля 2009

Другое предложение: используйте XMLEncoder и напишите необходимые PersistenceDelegate классы для объектов не в стиле bean; например,

static class FilePersistenceDelegate extends PersistenceDelegate {
    protected Expression instantiate(Object oldInstance, Encoder out) {
        File file = (File)oldInstance;
        return new Expression(oldInstance, oldInstance.getClass(), "new", new Object[]{ file.getPath() });
    }
}

Мой код для выполнения фактического кодирования будет выглядеть примерно так:

    XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(file))));

    for (Map.Entry<Class<?>, PersistenceDelegate> entry : MY_DELEGATES.entrySet()) {
        // Add any custom persistence delegates written.
        encoder.setPersistenceDelegate(entry.getKey(), entry.getValue());
    }

    encoder.writeObject(object);
    encoder.close();

    if (encoder.getException() != null) {
      // Encoding failed.
    }

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

1 голос
/ 16 июля 2009

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

Гораздо лучше выполнить сериализацию XML в другом объекте (ах).

0 голосов
/ 16 июля 2009

В дополнение к опциям, предоставленным другими, вы можете попробовать JAXB и StAX:

  • Вы можете использовать JAXB для сопоставления объектов с XML-схемой для магического ввода и вывода XML-документов.
  • Вы можете использовать StAX для чтения и записи XML-документов более простым способом, который соответствует вашим потребностям низкого уровня

Прелесть этих двух вариантов в том, что они поставляются как часть Java (JAXP) и, похоже, работают нормально, если, конечно, не существует лучших вариантов!

0 голосов
/ 16 июля 2009

Я рекомендую использовать XMLBeans.
Это инструмент / фреймворк, который может генерировать Jar-файл с компонентами синтаксического анализа и форматирования. Вам не нужно прикасаться к одному классу w3c.
Но это не то, почему я рекомендую это.

Проблема с форматами XML заключается в том, что если ваш формат меняется, вам нужно изменить код. Так что, если вы пропустите изменение? Вы не узнаете до времени выполнения.

XMLBeans сдвигает изменения формата, чтобы вы могли увидеть проблемы во время компиляции. То есть вы определяете контракт для формата (XSD), используйте XMLBeans для создания анализатора / форматера / верификатора. А остальное зависит от вашей IDE.

И в целом то, что вы думаете о разработке, звучит как то, что делает XMLBeans.

0 голосов
/ 16 июля 2009

Это не кажется необоснованным. Я хотел бы, чтобы ваш объект графа байесовской сети итерировал по каждой вершине / ребру и либо

  1. запрашивает у каждого компонента его XML и добавляет его к заполняемому объекту XML, или
  2. передать подлежащий заполнению объект XML (скажем, DOM) в компонент и позволить каждому компоненту записать свой XML

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

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