2016-04-27 15 views
0

Ich habe eine Zeichenfolge, die eine XML wie folgt enthält:Convert XML-Zeichenfolge mit Knoten in Java FX TreeView

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

Ich brauche einen treenode in meinem Treeview für jede Vertiefung so kann ich es erweitern und zusammenziehen, wenn ich weil in jedem Knoten so viele Informationen vorhanden sind, wie kann ich das machen?

Das Ergebnis sollte so aussehen:

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

Thank you!

Antwort

2

Verwenden Sie einen XML-Parser, um die Daten zu analysieren, erstellen Sie eine TreeItem, die es darstellt, und verwenden Sie eine TreeView, um die Daten anzuzeigen.

Beispiel:

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

Sie sind erstaunlich !! Es wirkt wie ein Zauber und rettete mir eine Menge Zeit !! Vielen Dank!! – master89

+0

Wie kann ich die Anzahl der Elemente begrenzen, die ich in meiner Baumansicht anzeigen möchte? – master89

+0

Nicht sicher, was genau Sie damit meinen ... Wenn Sie nur 'N'-Elemente anzeigen möchten, können Sie sicherstellen, dass nur' N-1'-Abkömmlinge von Ihrem Root-Element vorhanden sind oder Sie einen Listener verwenden, der automatisch einige zusammenbricht Wenn sich zu viele Objekte erweitern ... – fabian