Reputation: 27
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!
Upvotes: 1
Views: 5206
Reputation: 82461
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);
Upvotes: 4