简体   繁体   中英

get all values from child node Xml with Java

I'm trying to parse an XML file to make out of it excel file by using Java
and I can't understand how to retrieve all child nodes like these names ?

   <Products>
        <companies>
            <name>Al Rawabi</name>
            <name>Al Rifai</name>
            <name>Colgate-Palmolive</name>
            <name>Danone (Nutrition)</name>
            <name>Henkel</name>
        </companies>
    <Products>

I tried to make it this way, but as a result I'm getting an empty lists of names.

    NodeList ListOfProducts = xmlDoc.getElementsByTagName("Products"); //first we need to find total number of Products blocks
    int totalProducts = ListOfProducts.getLength();
        System.out.println("Total no of Products : " + totalProducts);
    for(int s = 0; s < ListOfProducts.getLength(); s++)
    {
        Node ProductsNode = listOfProducts.item(s);
        System.out.println("Products number : " + s);
        if (ProductsNode.getNodeType() == Node.ELEMENT_NODE)
        {
            Element ProductElement = (Element) ProductsNode;
            NodeList CompanyList = ProductElement.getElementsByTagName("companies"); // find node companies
            System.out.println("companies number : " + CompanyList.getLength());
            for(int cl = 0; cl < CompanyList.getLength(); cl++) {
                NodeList CompanyNameList = CompanyList.item(cl).getChildNodes();
                for (int j = 0; j < CompanyNameList.getLength(); j++) {
                    Node childNode = CompanyNameList.item(j);
                    if ("name".equals(childNode.getNodeName())) {
                        for (int nl = 0; nl < CompanyNameList.getLength(); nl++) {
                            Element CompanyNameElement = (Element) CompanyNameList.item(nl);
                            NodeList textFNList = CompanyNameElement.getChildNodes();
                            System.out.println("Company: " + nl + " :" + (textFNList.item(0)).getNodeValue().trim());
                            CompaniesNames.add((textFNList.item(0)).getNodeValue().trim());
                        }
                    }
                }
            }
        }// end of if clause
    }// end of for loop with s var
//load the xml file
function loadDoc(){
    //create the xml request
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
           myFunction(this);
        }
    };
    //open and send the request
    xhttp.open("GET", "filename.xml", true);
    xhttp.send();
}

//print the xml data in html
function myFunction(xml) {
    var i;
    var xmlDoc = xml.responseXML; //xml file loaded
    var x = xmlDoc.getElementsByTagName("companies");
    //loop through xml element
    for (i = 0; i < x.length; i++) {
        x[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
    }
}

This is the JavaScript version of doing you want to do. Hope you can use some of it in Java!

Below is how you can do it in XPath and VTD-XML. Beware that I am the author of VTD-XML so my pov may be biased.

import com.ximpleware.*;

public class extractName{
   public static void main(String s[]) throws VTDException{

          VTDGen vg = new VTDGen();
          if (!vg.parseFile("input.xml",false))
             return false;
          VTDNav vn = vg.getNav();
          AutoPilot ap =new AutoPilot(vn);
          ap.selectXPath("/Products/companies/names/text()");
          int i=0;
          while((i=ap.evalXPath())!=-1){
              System.out.println(" name is ===>"+vn.toString(i));
          }

   }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM