2016-07-20 36 views
0

我有一個JTree,其中輸入的XML文件被映射到其中。從JTree中識別所選XML節點的索引

library_system.xml

<library> 
    <user> 
     <name>Dinesh</name> 
     <book> 
      <info name="java">Java: The Complete Reference, 9th Edition</info> 
      <info name="price">700</info> 
      <details> 
       <parameter name="author">Herbert Schildt</parameter> 
       <parameter name="isbn">9339212096</parameter> 
       <parameter name="publisher">McGraw Hill Education</parameter> 
      </details> 
     </book> 
     <book> 
      <info name="java">Learning Python 3rd Edition</info> 
      <info name="price">1020</info> 
      <details> 
       <parameter name="author">Mark Lutz</parameter> 
       <parameter name="isbn">0596513984</parameter> 
       <parameter name="publisher">O'Reilly</parameter> 
      </details> 
     </book> 
    </user> 
    <user> 
     <name>Vignesh</name> 
     <book> 
      <info name="java">Java: The Complete Reference, 9th Edition</info> 
      <info name="price">700</info> 
      <details> 
       <parameter name="author">Herbert Schildt</parameter> 
       <parameter name="isbn">9339212096</parameter> 
       <parameter name="publisher">McGraw Hill Education</parameter> 
      </details> 
     </book> 
    </user> 
</library> 

當從JTree的選擇任何XML節點,我打印所選擇的節點名稱和它的父名。

StackOverFlow.java

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.TreeNode; 
import javax.swing.tree.TreePath; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

/** 
* 
* @author dsivaji 
*/ 
public class StackOverFlow { 

    public DefaultMutableTreeNode rootNode = null;//For writing 
    public Element rootElement = null; 
    private DocumentBuilder dBuilder = null; 
    public Document doc = null; 
    private String xmlFileName = null; 
    public static DefaultMutableTreeNode lastNode = null; 
    static String selctedXmlProperty = ""; 
    static String primaryCond = ""; 
    static Map<String, List> conditionsMap = new HashMap<String, List>(); 


    public StackOverFlow(String xmlFileName) { 

     try { 
      dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      doc = dBuilder.newDocument(); 

      if (rootNode == null) { 
       rootElement = doc.createElement("devices"); 
       doc.appendChild(rootElement); 
       rootNode = new DefaultMutableTreeNode(rootElement.getNodeName()); 
      } 
      this.xmlFileName = xmlFileName; 
     } catch (Exception e) { 
      System.out.println("Exception in the XML document builders at the constructuor of XMLManipulator"); 
     } 
    } 

    static DefaultMutableTreeNode parseXML(String xmlFileName) { 

     DefaultMutableTreeNode masterRootNode = null; 
     DocumentBuilder dBuilder = null; 
     Document doc = null; 

     try { 
      dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      doc = dBuilder.newDocument(); 
      doc = dBuilder.parse(xmlFileName); 
      if (doc.hasChildNodes()) { 
       masterRootNode = getXMLTree(doc.getChildNodes(), null); 
      } 
     } catch (Exception e) { 
      System.out.println("Exception in XML parsing" + e); 
      System.out.println("ex : " + e); 
      masterRootNode = new DefaultMutableTreeNode("ERROR"); 
     } 

     return masterRootNode; 
    } 

    private static DefaultMutableTreeNode getXMLTree(NodeList nodeList, DefaultMutableTreeNode treeParent) { 

     //This will be assumed to be master one. 
     DefaultMutableTreeNode rootParent = null; 

     //If treeParent is null, then it called from the main, not a recursive one. 
     if (treeParent == null) { 
      rootParent = new DefaultMutableTreeNode(""); 
     } else { 
      rootParent = treeParent; 
     } 

     for (int count = 0; count < nodeList.getLength(); count++) { 

      Node tempNode = nodeList.item(count); 

      // make sure it's element node. 
      if (tempNode.getNodeType() == Node.ELEMENT_NODE) { 

       // get node name and value 
       String myNodeName = tempNode.getNodeName().toUpperCase(); 

       DefaultMutableTreeNode parent = new DefaultMutableTreeNode(myNodeName); 
       lastNode = parent; 
//    System.out.println(tempNode.getNodeName() + " : " + tempNode.getNodeValue()); 
       //If it has the attributes, then appending it with the parent text 
       if (tempNode.hasAttributes()) { 

        // get attributes names and values 
        NamedNodeMap nodeMap = tempNode.getAttributes(); 

        for (int i = 0; i < nodeMap.getLength(); i++) { 

         Node node = nodeMap.item(i); 
         String nodeName = node.getNodeName(); 
         if (nodeName.equals("name")) { 
          System.out.println("attr value : " + node.getNodeValue() + ", " + tempNode.getNodeValue()); 

          parent.setUserObject(myNodeName + " (" + node.getNodeValue() + ")"); 
         } 
//      System.out.print("attr name : " + node.getNodeName()); 

        } 
       } else { 
//     System.out.println("Node Text content = " + tempNode.getTextContent()); 
       } 

       //Adding it to the root parent of this current context 
       rootParent.add(parent); 

       if (tempNode.hasChildNodes()) { 
        // loop again if has child nodes and add it to the rootParent 
        rootParent.add(getXMLTree(tempNode.getChildNodes(), parent)); 
       } 
//    System.out.println("Node Name = " + tempNode.getNodeName() + " [CLOSE]"); 
      } else if (tempNode.getNodeType() == Node.TEXT_NODE) { 
       String txtVal = tempNode.getNodeValue().trim(); 
       if (!txtVal.isEmpty()) { 
        if (lastNode != null) { 
         lastNode.setUserObject(lastNode.getUserObject() + " = " + txtVal); 
        } 
        System.out.println("->" + txtVal + "<-"); 
       } 
      } 
     } 
     return rootParent; 
    } 

    public void removeChilds(Node node) { 
     while (node.hasChildNodes()) { 
      node.removeChild(node.getFirstChild()); 
     } 
    } 

    public static void main(String[] args) { 
     showGUI("C:\\library_system.xml"); 
    } 

    public static void showGUI(final String logXmlFileName) { 
     JFrame topoWindow = new JFrame("Library Info"); 
     topoWindow.setTitle(logXmlFileName.substring(logXmlFileName.lastIndexOf("\\") + 1)); 
     topoWindow.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

     final JTree topoTree = new JTree(parseXML(logXmlFileName)); 

     topoTree.addTreeSelectionListener(new TreeSelectionListener() { 

      public void valueChanged(TreeSelectionEvent e) { 
       JTree treeSource = (JTree) e.getSource(); 
       TreePath tp = e.getNewLeadSelectionPath(); 

//    System.out.println(Arrays.toString(e.getPaths())); 
       System.out.println(e.getPath()); 
//    System.out.println(tp.getParentPath() + " at " + tp.getPathCount()); 
       if (tp != null) { 

        TreeNode lastPathComponent = (TreeNode) tp.getLastPathComponent(); 
        System.out.println(lastPathComponent.isLeaf()); 
        System.out.println("parent -> " + lastPathComponent.getParent().toString()); 
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent(); 
        System.out.println(node.getParent().getIndex(node)); 
//     System.out.println("parent ->" + lastPathComponent.getParent().getParent().getChildCount()); 
        selctedXmlProperty = tp.getLastPathComponent().toString(); 
        System.out.println("val ->" + tp.getLastPathComponent()); 
       } 
      } 
     }); 
     final JScrollPane scrlTreeView = new JScrollPane(topoTree); 

     final JPanel pnlLeft = new JPanel(new BorderLayout(5, 5)); 

     pnlLeft.add(scrlTreeView); 

     topoWindow.add(pnlLeft); 

     for (int i = 0; i < topoTree.getRowCount(); i++) { 
//    System.out.println(topoTree.getPathForRow(i)); 
      topoTree.expandRow(i); 
     } 

     topoWindow.pack(); 
     topoWindow.setLocationRelativeTo(null); 
     topoWindow.setSize(500, 500); 
     topoWindow.setVisible(true); 
    } 
} 

輸出: enter image description here

[, LIBRARY, USER, BOOK, DETAILS, PARAMETER (author) = Herbert Schildt] 
true 
parent -> DETAILS 
0 
val ->PARAMETER (author) = Herbert Schildt 

上述消息是由於以下方法

public void valueChanged(TreeSelectionEvent e) { 
    JTree treeSource = (JTree) e.getSource(); 
    TreePath tp = e.getNewLeadSelectionPath(); 
    System.out.println(e.getPath()); 
    if (tp != null) { 
     TreeNode lastPathComponent = (TreeNode) tp.getLastPathComponent(); 
     System.out.println(lastPathComponent.isLeaf()); 
     System.out.println("parent -> " + lastPathComponent.getParent().toString()); 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent(); 
     System.out.println(node.getParent().getIndex(node)); 
     selctedXmlProperty = tp.getLastPathComponent().toString(); 
     System.out.println("val ->" + tp.getLastPathComponent()); 
    } 
} 

在這裏,我該怎麼做才能知道一個人已經選擇第二個user元素的第一個book元素的第一個detail元素的屬性author

回答

1

valueChanged下面的方法調用添加到printDetails

public void valueChanged(TreeSelectionEvent e) { 
       JTree treeSource = (JTree) e.getSource(); 
       printDetails(e.getNewLeadSelectionPath());//This One 
       TreePath tp = e.getNewLeadSelectionPath(); 

方法printDetails將當前節點的父(當前節點被命名爲我),並試圖找到我的孩子的名單父母有。一旦發現它將打印帶有索引的消息,並對父級執行相同的操作,直到達到根目錄。如果您不打算在打印之前使用0-索引添加1到i

private void printDetails(TreePath me) { 
       DefaultMutableTreeNode mee = (DefaultMutableTreeNode) me.getLastPathComponent(); 
       TreePath parent = me.getParentPath(); 
       if(parent == null){ 
        return; 
       } 
       DefaultMutableTreeNode lastPathComponent = (DefaultMutableTreeNode) (parent.getLastPathComponent()); 
       for (int i = 0; i < lastPathComponent.getChildCount(); i++) { 
        if (lastPathComponent.getChildAt(i).equals(mee)) { 
         System.out.println(mee.getUserObject() + " I am the " + i + "th child of " + lastPathComponent.getUserObject()); 
        } 
       } 
       printDetails(parent); 
      }