使用Java FX中的节点将xml字符串转换为treeview

时间:2016-04-27 13:01:07

标签: javafx treeview javafx-8 treeviewitem

我有一个包含xml的String:

<root>
   <type>
      <element>
         <thing>
            <otherthing>...</otherthing>
         </thing>
      </element>
   </type>
   <type>
      <element>
         <thing>
            <otherthing>...</otherthing>
         </thing>
      </element>
   </type>
   <type>
      <element>
         <thing>
            <otherthing>...</otherthing>
         </thing>
      </element>
   </type>
</root>

我的树视图中需要一个treenode用于每个缩进,因此我可以在需要时扩展和收缩它,因为每个节点中有太多信息,我该怎么办?

结果应该是这样的:

ROOT
---+type
--------+element
----------------+thing
----------------------+otherthing
---+type
--------+element
----------------+thing
----------------------+otherthing
---+type
--------+element
----------------+thing
----------------------+otherthing

谢谢!

1 个答案:

答案 0 :(得分:3)

使用xml解析器解析数据,创建表示数据的TreeItem并使用TreeView显示数据。

示例:

private static class TreeItemCreationContentHandler extends DefaultHandler {

    private TreeItem<String> item = new TreeItem<>();

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // finish this node by going back to the parent
        this.item = this.item.getParent();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // start a new node and use it as the current item
        TreeItem<String> item = new TreeItem<>(qName);
        this.item.getChildren().add(item);
        this.item = item;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String s = String.valueOf(ch, start, length).trim();
        if (!s.isEmpty()) {
            // add text content as new child
            this.item.getChildren().add(new TreeItem<>(s));
        }
    }

}

public static TreeItem<String> readData(File file) throws SAXException, ParserConfigurationException, IOException {
    SAXParserFactory parserFactory = SAXParserFactory.newInstance();
    SAXParser parser = parserFactory.newSAXParser();
    XMLReader reader = parser.getXMLReader();
    TreeItemCreationContentHandler contentHandler = new TreeItemCreationContentHandler();

    // parse file using the content handler to create a TreeItem representation
    reader.setContentHandler(contentHandler);
    reader.parse(file.toURI().toString());

    // use first child as root (the TreeItem initially created does not contain data from the file)
    TreeItem<String> item = contentHandler.item.getChildren().get(0);
    contentHandler.item.getChildren().clear();
    return item;
}
// display data for file "data/tree.xml" in TreeView
TreeItem<String> root = readData(new File("data/tree.xml"));
TreeView<String> treeView = new TreeView<>(root);