JAVA XML - How to get specific elements in XML Node?

This is an academic assignment and we are presented with an extremely large XML file with hundreds of records like this. For each item, we must specify the ID of the manager, the ID of the face of the last person to add the item to the list, and the current number of items. I have read and re-read the Oracle DOM API and various Node. We are using JAVA and I have been unable to figure out for my whole life how to search for the different "fields" of each item_list

node. Below is an example of the data we are giving.

<item_list id="item_list01">
   <numitems_intial>5</numitems_initial>
   <item>
     <date_added>1/1/2014</date_added>
     <added_by person="person01" />
   </item>
   <item>
      <date_added>1/6/2014</date_added>
      <added_by person="person05" />
    </item>
    <numitems_current>7</numitems_current>
    <manager person="person48" />
</item_list>
<item_list id="item_list02">
   <numitems_intial>5</numitems_initial>
   <item>
     <date_added>1/15/2014</date_added>
     <added_by person="person05" />
   </item>
   <item>
     <date_added>1/1/2014</date_added>
     <added_by person="person09" />
   </item>
       <item>
         <date_added>1/9/2014</date_added>
         <added_by person="person45" />
       </item>
        <numitems_current>7</numitems_current>
        <manager person="person38" />
    </item_list>

      

I tried to do something similar to:

NodeList nodes = queryDoc.getElementsByTagName("item_list");

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

    Node node = nodes.item(i);

    if(node != null) {

       System.out.println(node.manager);

    }

}

      

And messing around with this code for a while, but I would like to know how to fetch data from different fields in each node.

+5


source to share


2 answers


If you are trying to read the person attribute of the 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;
}
}

      

+10


source


Or, using xml, you may need to edit the original 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 "";
    }
}

      

0


source







All Articles