Search code examples
javafxtreeviewjavafx-8treeviewitem

Convert xml string to treeview with nodes in Java FX


I have a String that contains an xml like this:

<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>

I need a treenode in my treeview for each indentation so I can expand and contract it when I want cause there is so much information in each node, how can I do it?

The result should be like this:

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

Thank you!


Solution

  • Use a xml parser to parse the data, create a TreeItem representing it and use a TreeView to display the data.

    Example:

    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);