JAVA XML - How do I get specific elements in an XML Node?

Or, using xml you might need to edit the initial content. I suggest the following approach

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;
import org.xml.sax.SAXException;


public class ReadXML {

    public static void main(String[] args) {
        try {
            Document doc = getDocument("/home/abc/Test.xml");

            System.out.println(getString(getNodeByName(doc,"item_list01")));
        } catch (TransformerException | ParserConfigurationException | IOException | SAXException e) {
            // Log e.printStackTrace();
        }
    }

    private static Document getDocument(String filePath) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = dbfac.newDocumentBuilder();

        return docBuilder.parse(filePath);
    }

    private static String getString(Node node) throws TransformerException {
        StringWriter sw = new StringWriter();
        Transformer t = TransformerFactory.newInstance().newTransformer();
        t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        t.setOutputProperty(OutputKeys.INDENT, "yes");
        t.transform(new DOMSource(node), new StreamResult(sw));

        return sw.toString();
    }

    public static Node getNodeByName(Document doc, String nodeName) {
        Node node = null;
        for (int i = 0; i < doc.getDocumentElement().getChildNodes().getLength(); i++) {
            if (!getTagName(doc, i).equals("#text")) {
                for (int j = 0; j < getNodeName(doc, i).getChildNodes().getLength(); j++) {
                    if (getNodeName(doc, i, j).equalsIgnoreCase("item_list")  && getNodeAttributes(doc,i,j).equalsIgnoreCase(nodeName)) {
                        node = getNodeName(doc, i);
                    }
                }
            }
        }
        return node;
    }

    private static String getTagName(Document doc, int i) {
        return getNodeName(doc, i).getNodeName();
    }

    private static Node getNodeName(Document doc, int i) {
        return (doc.getDocumentElement().getChildNodes().item(i));
    }

    private static String getNodeName(Document doc, int i, int j) {
        return getNodeName(doc, i).getChildNodes().item(j).getNodeName();
    }
    private static String getNodeAttributes(Document doc, int i, int j) {
        if(getNodeName(doc, i).getChildNodes().item(j).hasAttributes()){
            return getNodeName(doc, i).getChildNodes().item(j).getAttributes().item(0).getNodeValue();
        }
        return "";
    }
}

If you are trying to read person attribute of manager tag, you can do it as shown below -

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class Test{

public static void main (String[] args)
{
    Test test = new Test();
    test.readXML();
}

private void readXML()
{
    Document doc = null;
    try 
    {
        doc = parseXML("/home/abc/Test.xml");
    } 
    catch (ParserConfigurationException e) 
    {
        e.printStackTrace();
    } 
    catch (SAXException e) 
    {
        e.printStackTrace();
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }

    if(doc != null)
    {
        NodeList nList = doc.getElementsByTagName("item_list");
        for (int i = 0; i < nList.getLength(); i++) 
        {
            Node nNode = nList.item(i);
            Element eElement = (Element) nNode;
            Element cElement =  (Element) eElement.getElementsByTagName("manager").item(0);
            System.out.println("Manager ID : " + cElement.getAttribute("person"));
        }
    }
}

private Document parseXML(String filePath) throws ParserConfigurationException, SAXException, IOException
{
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(filePath);
    doc.getDocumentElement().normalize();
    return doc;
}
}

Tags:

Java

Xml

Dom