使用Java从子节点Xml获取所有值

时间:2017-08-31 19:53:18

标签: java xml dom

我正在尝试解析一个XML文件,使用Java来制作excel文件 我无法理解如何检索所有这些名称的子节点?

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

我试图这样做,但结果我得到一个空的名单。

    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

2 个答案:

答案 0 :(得分:0)

//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;
    }
}

这是你想做的JavaScript版本。希望你能在Java中使用它!

答案 1 :(得分:0)

下面是如何在XPath和VTD-XML中执行此操作。请注意,我是VTD-XML的作者,所以我的pov可能有偏见。

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));
          }

   }
}