首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用NodeList遍历XML中的所有元素

使用NodeList遍历XML中的所有元素
EN

Stack Overflow用户
提问于 2013-01-29 00:31:40
回答 3查看 172.8K关注 0票数 34

我想遍历一段XML中的所有元素,打印每个元素。我的问题是,我总是在staff1标记之后得到一个空指针异常,即john 465456433 gmail1 area1 city1

下面是打印xml文件中所有元素的Java代码:

代码语言:javascript
复制
File fXmlFile = new File("file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);

doc.getDocumentElement().normalize();

System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

NodeList nList = doc.getElementsByTagName("*");

System.out.println("----------------------------");

Node n=null;
Element eElement=null;

for (int i = 0; i < nList.getLength(); i++) {           
  System.out.println(nList.getLength());     
  n= nList.item(i);                            
  System.out.println("\nCurrent Element :" + n.getNodeName());


  if (n.getNodeType() == Node.ELEMENT_NODE) {
    eElement = (Element) n.getChildNodes();
    System.out.println("\nCurrent Element :" + n.getNodeName());
    name = eElement.getElementsByTagName("name").item(i).getTextContent(); //here throws null pointer exception after printing staff1 tag
    phone = eElement.getElementsByTagName("phone").item(i).getTextContent();
    email = eElement.getElementsByTagName("email").item(i).getTextContent();
    area = eElement.getElementsByTagName("area").item(i).getTextContent();
    city = eElement.getElementsByTagName("city").item(i).getTextContent();
  }
  n.getNextSibling();
}

XML文件:

代码语言:javascript
复制
<?xml version="1.0"?>
<company>
  <staff1>
    <name>john</name>
    <phone>465456433</phone>
    <email>gmail1</email>
    <area>area1</area>
    <city>city1</city>
  </staff1>
  <staff2>
    <name>mary</name>
    <phone>4655556433</phone>
    <email>gmail2</email>
    <area>area2</area>
    <city>city2</city>
  </staff2>
  <staff3>
    <name>furvi</name>
    <phone>4655433</phone>
    <email>gmail3</email>
    <area>area3</area>
    <city>city3</city>
  </staff3>
</company>

预期输出:

代码语言:javascript
复制
john
465456433
gmail1
area1
city1
mary
4655556433
gmail2
area2
city2
furvi
4655433
gmail3
area3
city3
EN

回答 3

Stack Overflow用户

发布于 2015-06-06 20:14:10

代码语言:javascript
复制
public class XMLParser {
   public static void main(String[] args){
      try {
         DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
         Document doc = dBuilder.parse(new File("xml input"));
         NodeList nl=doc.getDocumentElement().getChildNodes();

         for(int k=0;k<nl.getLength();k++){
             printTags((Node)nl.item(k));
         }
      } catch (Exception e) {/*err handling*/}
   }

   public static void printTags(Node nodes){
       if(nodes.hasChildNodes()  || nodes.getNodeType()!=3){
           System.out.println(nodes.getNodeName()+" : "+nodes.getTextContent());
           NodeList nl=nodes.getChildNodes();
           for(int j=0;j<nl.getLength();j++)printTags(nl.item(j));
       }
   }
}

递归地遍历并打印出文档中的所有XML子标记,以防您不必更改代码来处理xml中的动态变化,前提是它是格式良好的xml。

票数 8
EN

Stack Overflow用户

发布于 2016-06-10 21:36:38

这是使用JDOM遍历XML元素的另一种方法。

代码语言:javascript
复制
        List<Element> nodeNodes = inputNode.getChildren();
        if (nodeNodes != null) {
            for (Element nodeNode : nodeNodes) {
                List<Element> elements = nodeNode.getChildren(elementName);
                if (elements != null) {
                    elements.size();
                    nodeNodes.removeAll(elements);
                }
            }
票数 3
EN

Stack Overflow用户

发布于 2021-10-07 14:24:26

代码语言:javascript
复制
NodeList listaHijos = docEle.getChildNodes();
        listaHijos = listaHijos.item(2).getChildNodes();
        for (int i = 0; i < listaHijos.getLength(); i++) {
            eElement = (Element) listaHijos.item(i);
            n2 = eElement.getChildNodes();
            for (int j = 0; j < n2.getLength(); j++) {
                System.out.println("elem:" + n2.item(j).getNodeName() + " :" + n2.item(j).getTextContent() + "j" + j);
                if (n2.item(j).getNodeName().equals("detallesAdicionales")) {                                                                        
                    eElement = (Element) n2.item(j);
                    n6 = eElement.getChildNodes();
                    System.out.println("todo: " + n6.item(0).getAttributes().item(0) + n6.item(0).getAttributes().item(1));                        
                    System.out.println("todo2: " + n6.item(1).getAttributes().item(0) + n6.item(1).getAttributes().item(1));                        
                    System.out.println("todo3: " + n6.item(2).getAttributes().item(0) + n6.item(2).getAttributes().item(1));                        
                    System.out.println("nombre: " + n6.item(0).getAttributes().item(0).getTextContent());
                    System.out.println("valor: " + n6.item(0).getAttributes().item(1).getTextContent());
                }
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14566596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档