Конвертировать JTree в XML - PullRequest
       10

Конвертировать JTree в XML

0 голосов
/ 07 апреля 2010

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

 XMLEncoder e = new XMLEncoder(
                new BufferedOutputStream(new FileOutputStream(f.toString())));
        e.writeObject(o);
        e.close();

.. но я не могу заставить это работать; он возвращает файл XML, но это не совсем правильно, выглядит так:

<java version="1.6.0_17" class="java.beans.XMLDecoder"> 
 <object class="javax.swing.JTree"> 
  <object class="javax.swing.tree.DefaultTreeModel"> 
   <object class="javax.swing.tree.DefaultMutableTreeNode"> 
    <void property="userObject"> 

.. и т. Д., Но там нет моих данных.

(PS: Пожалуйста, будьте нежны, я очень новичок в Java!)

1 Ответ

1 голос
/ 07 апреля 2010

XMLEncoder - это универсальная утилита для кодирования bean-компонентов в виде текста. Я не думаю, что это подходит в вашем случае.

Я написал фрагмент кода, который выполняет свою работу, предполагая, что я хорошо понимаю ваши потребности. Вам нужно только передать древовидную модель в качестве параметра методу toXml. Обратите внимание, что это всего лишь черновик; Возможно, вы захотите по-разному обрабатывать исключения и по-разному управлять параметрами преобразования. Более того, вы можете манипулировать рекурсивным методом createTree, чтобы изменить структуру узла XML, созданного для узла дерева.

public static String toXml(TreeModel model) throws ParserConfigurationException, TransformerException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    DOMImplementation impl = builder.getDOMImplementation();

    // Build an XML document from the tree model
    Document doc = impl.createDocument(null,null,null);
    Element root = createTree(doc, model, model.getRoot());
    doc.appendChild(root);

    // Transform the document into a string
    DOMSource domSource = new DOMSource(doc);
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    StringWriter sw = new StringWriter();
    StreamResult sr = new StreamResult(sw);
    transformer.transform(domSource, sr);
    return sw.toString();
}

private static Element createTree(Document doc, TreeModel model, Object node) {
    Element el = doc.createElement(node.toString());
    for(int i=0;i<model.getChildCount(node);i++){
        Object child = model.getChild(node, i);
        el.appendChild(createTree(doc,model,child));
    }
    return el;
}
...