Рекурсивное построение XML-дерева с использованием dom4j без дублирования кода для корневого узла

Я преобразовываю древовидную структуру в XML-данные. Мое дерево похоже

Company
  Department
    Employee
    Employee

Мне нужен корневой узел Company, поэтому XML будет выглядеть примерно так

<?xml version="1.0" encoding="UTF-8"?>
<Company>
  <Department>
    <Employee>
       ...
    </Employee>
  </Department>
</Company>

Посмотрев на примеры, решил, что напишу так

public void writeNodes(Element root, NodeBase node) throws XMLStreamException
{
    Element elmt = root.addElement(node.getName());
    for (NodeBase child : node.getChildren())
    {
        writeNodes(child);
    }
}

public void makeXML(NodeCompany root, String filename)
{
    try {
        document = DocumentHelper.createDocument();            
        writeNodes(???, root);
        writeFile(document, filename);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

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

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

Есть ли способ завершить этот код без дублирования кода?


person MxLDevs    schedule 10.03.2014    source источник
comment
Для чего вы будете использовать этот xml-файл? Было бы полезно использовать JSON? Одно замечание из опыта: всякий раз, когда кто-то говорит, что никогда не будет больше одного ... дизайн для нескольких. (Вы даже можете использовать Company x и Company textX как две компании для тестирования изменений функциональности в течение жизненного цикла вашего проекта / продукта.   -  person ErstwhileIII    schedule 10.03.2014
comment
В нашей спецификации указано, что будет только один. Больше нет и это недействительные данные. Я не думаю, что было бы необходимо проектировать с учетом возможности изменения спецификаций (поскольку они не менялись в течение 20 лет). XML используется, потому что другие инструменты ожидают XML, и мы единственные, кто все еще использует старый формат сериализации.   -  person MxLDevs    schedule 10.03.2014
comment
JSON - это кодировка XML (с дополнительными механизмами для кодирования / декодирования объектов Java ... включая имеющуюся у вас простую структуру (уменьшение объема кода, который вам нужно написать).   -  person ErstwhileIII    schedule 10.03.2014
comment
Написанный мною экспортер XML уже довольно мал (20 строк, 4 метода), за исключением того, что он обрабатывает корневой узел отдельно от его дочерних узлов. JSON может быть крутым, но я не хочу просить всех остальных принять JSON.   -  person MxLDevs    schedule 10.03.2014
comment
Это нормально .. JSON - это просто особый формат XML (Компания содержит массив Департамента, содержащий массив Сотрудника).   -  person ErstwhileIII    schedule 10.03.2014
comment
Я не думаю, что JSON является подмножеством XML в том смысле, что XML является подмножеством SGML.   -  person MxLDevs    schedule 10.03.2014
comment
Вы правы, JSON не является подмножеством xml ... просто определяет конкретный формат xml.   -  person ErstwhileIII    schedule 10.03.2014
comment
JSON и XML - два совершенно разных формата сериализации. Нет определенного формата XML. XML - это XML. Я не ожидаю, что синтаксический анализатор XML будет принимать данные JSON, и я бы не стал рассматривать JSON как действительный XML, поэтому я не думаю, что было бы хорошо просто написать JSON и надеяться, что синтаксические анализаторы XML справятся с этим.   -  person MxLDevs    schedule 10.03.2014


Ответы (1)


Hy,

для меня метод writeNodes не нужен, вы можете сделать это:

public void makeXML(Element rootElement, String filename) {
    try {

        //you must detach it for you can add it in the new document after
        Element rootElementCopied = (Element) rootElement.clone();

        Document document = DocumentHelper.createDocument();


        document.add(rootElementCopied);

        writeFile(document, filename);
    }
    catch (Exception e){
        e.printStackTrace();
    }
}
person sghaier ali    schedule 30.04.2014