Search code examples
javaxmldom4jsimplify

Parsing element in XML in simple way, dom4j


How can I simplify a mess of code when I'm on node of elements? My code looks like:

private void readXmldata(String xml_debug_settings)
{
    File xml_debug_settings_file = new File(xml_debug_settings);

    if (xml_debug_settings_file.exists())
    {            
        SAXReader saxReader = new SAXReader();

        try {

            Document document = saxReader.read(xml_debug_settings_file);

            Element root = document.getRootElement();

            Iterator itr = root.elements().iterator();  

            Element element =null;

            while (itr.hasNext()) {  

                Element debel = (Element) itr.next();

                if (debel.getName().equals("mainnode")) { 

                    Iterator itrd = debel.elementIterator();

                    while (itrd.hasNext())
                    {
                        Element child = (Element) itrd.next();

                        System.out.println(child.getName());

                        if (child.getName().equals("node1"))
                        {
                            System.out.println(child.getText());
                        }

                        if (child.getName().equals("node2"))
                        {
                            System.out.println(child.getText());
                        }

                        if (child.getName().equals("node3"))
                        {
                            System.out.println(child.getText());
                        }

                        if (child.getName().equals("node4"))
                        {
                            System.out.println(child.getText());
                        }

                        if (child.getName().equals("node4"))
                        {
                            System.out.println(child.getText());
                        }

                        if (child.getName().equals("node5"))
                        {
                            System.out.println(child.getText());
                        }
                    }

               }  

            }  

        } catch (DocumentException ex) {
            Logger.getLogger(Debugsettings.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

}

I want less code of this example: (very mess and not properly clean a code):

    if (child.getName().equals("node1"))
    {
        System.out.println(child.getText());
    }

    if (child.getName().equals("node2"))
    {
        System.out.println(child.getText());
    }

    if (child.getName().equals("node3"))
    {
        System.out.println(child.getText());
    }

    if (child.getName().equals("node4"))
    {
        System.out.println(child.getText());
    }

    if (child.getName().equals("node4"))
    {
        System.out.println(child.getText());
    }

    if (child.getName().equals("node5"))
    {
        System.out.println(child.getText());
    }

Solution

  • Solved.

    So, none of users recommend me for answer so I found solution.

    public Map<String, String> readXmldata(String xml_debug_settings, String node)
        {
    
            File xml_debug_settings_file = new File(xml_debug_settings);
    
            if (xml_debug_settings_file.exists())
            {            
                SAXReader saxReader = new SAXReader();
    
                try {
    
                    Document document = saxReader.read(xml_debug_settings_file);
    
                    //Document temp = DocumentHelper.parseText("");  
    
                    Element root = document.getRootElement();
    
                    Iterator itr = root.elements().iterator();  
    
                    Element element = null;
    
                    while (itr.hasNext()) {  
    
                        Element debel = (Element) itr.next();
    
                        // System.out.println(debel.getName());    // node_name_1
    
                        if (debel.getName().equals(node)) { 
    
                            Iterator itrd = debel.elementIterator();
    
                            while (itrd.hasNext())
                            {
                                Element child = (Element) itrd.next();
                                String name = child.getName();  // node_name_2
    
                                int nodecount = child.nodeCount();
    
                                for (int i=0; i<nodecount; i++)
                                {
                                    xmlarray.put(name, child.getStringValue());
                                }
                            }
    
                            return this.xmlarray;
                       }
                    }  
    
                } catch (DocumentException ex) {
                    Logger.getLogger(Debugsettings.class.getName()).log(Level.SEVERE, null, ex);
                }
    
    
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Not exists:"  + xml_debug_settings, "Failed to open xml", JOptionPane.WARNING_MESSAGE);
            }
            return null;
    
        }
    

    And grab a data like this:

    Map<String, String> arrayList = xmlparser.readXmldata(this.xml_debug_settings, "someconfig");
    
    System.out.prinln(arrayList.get("config1"));
    

    Xml structure:

    <document>
     <someconfig>
       <config1>value_of_config</config>
     </someconfig>
    </document>
    

    Hope this someone to help.