0

我看过很多关于如何将 XML 读入 JTree 的文章,但很少有关于如何从 JTree 创建 XML 的文章。谁能帮我一个简单的方法来解决这个问题?我看过一个看起来像这样的例子:

 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很陌生!)

4

1 回答 1

1

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;
}
于 2010-04-06T21:37:10.943 回答