1

I have a following xml, with multiple levels( level 1, level 2, level 3). All the level 1 will go into the tab like showed in the picture.

<?xml version="1.0" encoding="UTF-8"?>
<treeNode label="projectTags" level="0">
    <reference/>
    <treeNode label="category" level="1">
        <reference>
            <dataField name="category_id" value="2"/>
            <dataField name="labelFieldValue" value="IRIS"/>
            <dataField name="category" value="IRIS"/>
            <dataField name="labelFieldName" value="Category"/>
            <dataField name="idFieldName" value="category_id"/>
            <dataField name="idFieldValue" value="2"/>
        </reference>
        <treeNode label="project" level="2">
            <reference>
                <dataField name="category_id" value="2"/>
                <dataField name="projectvisible" value="1"/>
                <dataField name="project" value="Acenaphthene"/>
                <dataField name="labelFieldValue" value="Acenaphthene"/>
                <dataField name="labelFieldName" value="Project"/>
                <dataField name="projectactive" value="1"/>
                <dataField name="idFieldName" value="Project_id"/>
                <dataField name="idFieldValue" value="1436"/>
                <dataField name="project_id" value="1436"/>
                <dataField name="casrn" value="83-32-9"/>
            </reference>
        </treeNode>
        <treeNode label="project" level="2">
            <reference>
                <dataField name="category_id" value="2"/>
                <dataField name="projectvisible" value="1"/>
                <dataField name="project" value="Acetaldehyde"/>
                <dataField name="labelFieldValue" value="Acetaldehyde"/>
                <dataField name="labelFieldName" value="Project"/>
                <dataField name="projectactive" value="1"/>
                <dataField name="idFieldName" value="Project_id"/>
                <dataField name="idFieldValue" value="37"/>
                <dataField name="project_id" value="37"/>
                <dataField name="casrn" value="75-07-0"/>
            </reference>
            <treeNode label="usage" level="3">
                <reference>
                    <dataField name="usageVisible" value="1"/>
                    <dataField name="labelFieldValue" value="1991 IRIS"/>
                    <dataField name="usage_id" value="1158"/>
                    <dataField name="usageActive" value="1"/>
                    <dataField name="parent_usage" value=""/>
                    <dataField name="projectActive" value="1"/>
                    <dataField name="parent_usage_id" value=""/>
                    <dataField name="idFieldName" value="usage_id"/>
                    <dataField name="projectVisible" value="1"/>
                    <dataField name="isdefault" value="0"/>
                    <dataField name="usage" value="1991 IRIS"/>
                    <dataField name="description" value=""/>
                    <dataField name="labelFieldName" value="usage"/>
                    <dataField name="idFieldValue" value="1158"/>
                    <dataField name="project_id" value="37"/>
                </reference>
            </treeNode>
        </treeNode>
    </treeNode>
    <treeNode label="category" level="1">
            <reference>
                <dataField name="category_id" value="1"/>
                <dataField name="labelFieldValue" value="NAAQS"/>
                <dataField name="category" value="NAAQS"/>
                <dataField name="labelFieldName" value="Category"/>
                <dataField name="idFieldName" value="category_id"/>
                <dataField name="idFieldValue" value="1"/>
            </reference>
            <treeNode label="project" level="2">
                <reference>
                    <dataField name="category_id" value="1"/>
                    <dataField name="projectvisible" value="1"/>
                    <dataField name="project" value="Aquatic Acidification"/>
                    <dataField name="labelFieldValue" value="Aquatic Acidification"/>
                    <dataField name="labelFieldName" value="Project"/>
                    <dataField name="projectactive" value="1"/>
                    <dataField name="idFieldName" value="Project_id"/>
                    <dataField name="idFieldValue" value="1576"/>
                    <dataField name="project_id" value="1576"/>
                    <dataField name="casrn" value=""/>
                </reference>
                <treeNode label="usage" level="3">
                    <reference>
                        <dataField name="usageVisible" value="1"/>
                        <dataField name="labelFieldValue" value="All refs"/>
                        <dataField name="usage_id" value="651"/>
                        <dataField name="usageActive" value="1"/>
                        <dataField name="parent_usage" value=""/>
                        <dataField name="projectActive" value="1"/>
                        <dataField name="parent_usage_id" value=""/>
                        <dataField name="idFieldName" value="usage_id"/>
                        <dataField name="projectVisible" value="1"/>
                        <dataField name="isdefault" value="0"/>
                        <dataField name="usage" value="All refs"/>
                        <dataField name="description" value=""/>
                        <dataField name="labelFieldName" value="usage"/>
                        <dataField name="idFieldValue" value="651"/>
                        <dataField name="project_id" value="1576"/>
                    </reference>
                    <treeNode label="usage" level="4">
                        <reference>
                            <dataField name="usageVisible" value="1"/>
                            <dataField name="labelFieldValue" value="Hydrology"/>
                            <dataField name="usage_id" value="652"/>
                            <dataField name="usageActive" value="1"/>
                            <dataField name="parent_usage" value="All refs"/>
                            <dataField name="projectActive" value="1"/>
                            <dataField name="parent_usage_id" value="651"/>
                            <dataField name="idFieldName" value="usage_id"/>
                            <dataField name="projectVisible" value="1"/>
                            <dataField name="isdefault" value="0"/>
                            <dataField name="usage" value="Hydrology"/>
                            <dataField name="description" value=""/>
                            <dataField name="labelFieldName" value="usage"/>
                            <dataField name="idFieldValue" value="652"/>
                            <dataField name="project_id" value="1576"/>
                        </reference>
                    </treeNode>
                </treeNode>
            </treeNode>
        </treeNode>
    </treeNode>

I need to parse it into JTree, to make it look like

enter image description here

I am using following code,

private DefaultMutableTreeNode buildTreeNode(Node rootNode)
        {
            DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(rootNode.getNodeName());

            System.out.println("root\t" + rootNode.getNodeName() + "\t" + rootNode.getNodeValue());
            if (rootNode.hasAttributes())
            {
                NamedNodeMap attributes = rootNode.getAttributes();

            if (attributes.item(0).toString().contains("labelFieldValue"))
            {
                System.out.println(attributes.item(0).toString() + "\t" + attributes.item(1).toString());
                String attr = attributes.item(1).toString();
                treeNode.add(new DefaultMutableTreeNode("@" + attr));
            }
        }

        if (rootNode.hasChildNodes())

        {
            NodeList children = rootNode.getChildNodes();

            for (int i = 0; i < children.getLength(); i++)
            {
                Node node = children.item(i);
                short nodeType = node.getNodeType();

                if (nodeType == Node.ELEMENT_NODE)
                {
                    treeNode.add(buildTreeNode(node));
                }
                else if (nodeType == Node.TEXT_NODE)
                {
                    String text = node.getTextContent().trim();
                    if (!text.equals(""))
                        treeNode.add(new DefaultMutableTreeNode(text));

                }
            }
        }
        return treeNode;
    }

but i get following enter image description here

How can I fix it?. I need to show only the values under "labelFieldValue", not everything.

user1631306
  • 4,350
  • 8
  • 39
  • 74

1 Answers1

3
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    File f = new File("Elements2.xml");
    Document d = builder.parse(f);
    Node node = d.getDocumentElement();
    DefaultMutableTreeNode parent = new DefaultMutableTreeNode();
    parent = buildTreeNode(parent, node);
    final DefaultMutableTreeNode finalnode = parent;

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI(finalnode);
        }
    });

}

private static void createAndShowGUI(DefaultMutableTreeNode parent) {
    final JFrame frame = new JFrame("Split Pane Example");
    // Display the window.
    frame.setSize(500, 300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // set grid layout for the frame
    frame.getContentPane().setLayout(new GridLayout(1, 1));

    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    tabbedPane.addTab("IRIS", makePanel("IRIS", parent, 0));
    tabbedPane.addTab("NAAQS", makePanel("NAAQS", parent, 1));
    frame.getContentPane().add(tabbedPane);
}

private static JPanel makePanel(String text, DefaultMutableTreeNode parent, int i) {
    JPanel p = new JPanel();
    //p.add(new Label(text));
    p.setLayout(new GridLayout(1, 1));
    JTree jtree = new JTree(parent.getChildAt(i));
    JScrollPane sp = new JScrollPane(jtree);
    p.add(sp);
    return p;
}

private static boolean specialCase = false;
private static DefaultMutableTreeNode buildTreeNode(DefaultMutableTreeNode parent, Node parentNode) {
    DefaultMutableTreeNode currentLevel = null;
    if (parentNode.getNodeName().equals("treeNode")) {
        NodeList children = parentNode.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node node = children.item(i);
            if (node.getNodeName().equals("reference") && !node.hasChildNodes()) {
                currentLevel = new DefaultMutableTreeNode("root");
                specialCase = true;

            } else if (node.getNodeName().equals("reference") && node.hasChildNodes()) {
                NodeList dataFields = node.getChildNodes();
                for (int j = 0; j < dataFields.getLength(); j++) {
                    Node dataField = dataFields.item(j);
                    NamedNodeMap attributes = dataField.getAttributes();
                    if (attributes != null && attributes.item(0).toString().contains("labelFieldValue")) {
                        String attr = attributes.item(1).toString();
                        currentLevel = new DefaultMutableTreeNode("@"+attr);
                        parent.add(currentLevel);
                        break;
                    }                   
                }
            } else if (node.getNodeName().equals("treeNode") && node.hasChildNodes() && specialCase) {
                specialCase = false;
                parent = buildTreeNode(currentLevel, node);
            } else if (node.getNodeName().equals("treeNode") && node.hasChildNodes() && !specialCase) {
                currentLevel = buildTreeNode(currentLevel, node);
            }
        }
    }
    return parent;
}
alexrnov
  • 2,346
  • 3
  • 18
  • 34
Ray
  • 3,864
  • 7
  • 24
  • 36
  • actually, thats really close, but not exactly how I want it. Currently, everything is under the root node. Its like IRIS is parent node, with two children node, Acenaphthene and Acetaldehyde, where Acetaldehyde has another child 1991 IRIS. So, basically, if you look at the level, you would know how the hierarchy is defined. – user1631306 May 21 '17 at 07:48
  • Ok.. phew, that took quite a while to come up with the logic. I had to introduce a global boolean variable to handle the special case of the root level 'reference' element not having any dataFields. I hope that's ok? I've updated the whole answer. Let me know. – Ray May 21 '17 at 10:27
  • Awesome. That worked great. One last thing. I have some 7 levels like IRIS, which have level=1(please refer the image in my question). Would it be possible to put these as JTab, IRIS, NAAQS, PPRTV, etc.) – user1631306 May 21 '17 at 14:31
  • Sure, why not. As long as the hierarchy is same this code should work fine. If it doesn't, please add the xml with 7 levels to the question and I'll take a look. – Ray May 21 '17 at 14:34
  • updated the xml in question. It has two levels, IRIS and NAAQS with level =1, which would be Jtabs – user1631306 May 21 '17 at 15:05
  • I ran the new xml. The root node is showing both IRIS and NAAQS as children at level 1, and NAAQS is showing further children as well, as expected. Perhaps I'm not understanding what you mean by putting them as JTabs? – Ray May 21 '17 at 15:18
  • look at the example image(first) in the question, where IRIS, NAAQS, PPRTV, ExpoDocs are in tab on the top of the window. – user1631306 May 21 '17 at 15:42
  • Updated again. I used example codes from https://examples.javacodegeeks.com/desktop-java/swing/jtabbedpane/create-jtabbedpane-example/ and http://www.codejava.net/java-se/swing/jtree-basic-tutorial-and-examples in case you're wondering why the JTree and JPanel stuff look generic. – Ray May 21 '17 at 16:09