为什么代码继续打印元素,当它打印的列表中只有1个元素?

时间:2014-01-24 16:44:23

标签: java xml dom

为什么代码会继续打印元素,当它打印的列表中只包含1个元素时?


<?xml version="1.0"?>
<company>
    <staff id="1001">
        <firstname>yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </staff>
    <staff id="2001">
        <firstname>low</firstname>
        <lastname>yin fong</lastname>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </staff>
</company>

package com.mkyong.seo;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile2 {

  public static void main(String[] args) {

    try {

    File file = new File("/Users/mkyong/staff.xml");

    DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance()
                             .newDocumentBuilder();

    Document doc = dBuilder.parse(file);

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

    if (doc.hasChildNodes()) {

        printNote(doc.getChildNodes());

    }

    } catch (Exception e) {
    System.out.println(e.getMessage());
    }

  }

  private static void printNote(NodeList nodeList) {

    for (int count = 0; count < nodeList.getLength(); count++) {

    Node tempNode = nodeList.item(count);

    // make sure it's element node.
    if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

        // get node name and value
        System.out.println("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
        System.out.println("Node Value =" + tempNode.getTextContent());

        if (tempNode.hasAttributes()) {

            // get attributes names and values
            NamedNodeMap nodeMap = tempNode.getAttributes();

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

                Node node = nodeMap.item(i);
                System.out.println("attr name : " + node.getNodeName());
                System.out.println("attr value : " + node.getNodeValue());

            }

        }

        if (tempNode.hasChildNodes()) {

            // loop again if has child nodes
            printNote(tempNode.getChildNodes());

        }

        System.out.println("Node Name =" + tempNode.getNodeName() + " [CLOSE]");

    }

    }

  }

}

输出: -

Root element :company

Node Name =company [OPEN]
Node Value =

        yong
        mook kim
        mkyong
        100000


        low
        yin fong
        fong fong
        200000



Node Name =staff [OPEN]
Node Value =
        yong
        mook kim
        mkyong
        100000

attr name : id
attr value : 1001

Node Name =firstname [OPEN]
Node Value =yong
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Value =mook kim
Node Name =lastname [CLOSE]

Node Name =nickname [OPEN]
Node Value =mkyong
Node Name =nickname [CLOSE]

Node Name =salary [OPEN]
Node Value =100000
Node Name =salary [CLOSE]
Node Name =staff [CLOSE]

Node Name =staff [OPEN]
Node Value =
        low
        yin fong
        fong fong
        200000

attr name : id
attr value : 2001

Node Name =firstname [OPEN]
Node Value =low
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Value =yin fong
Node Name =lastname [CLOSE]

Node Name =nickname [OPEN]
Node Value =fong fong
Node Name =nickname [CLOSE]

Node Name =salary [OPEN]
Node Value =200000
Node Name =salary [CLOSE]
Node Name =staff [CLOSE]
Node Name =company [CLOSE]

据我所知,输出不应该超越: -

Node Name =firstname [OPEN]
Node Value =low
Node Name =firstname [CLOSE] 

第一次。

请帮忙

2 个答案:

答案 0 :(得分:1)

您正在浏览XML,就像它是一棵树一样,一次沿着每个分支。你打印的列表中只有1个元素的原因,是因为在那个分支中,你是元素firstname,有1个子节点,文本节点说“低”,当你完成执行时,你退回到前一个分支,然后转到下一个子元素(姓氏)。如果你添加一些东西来显示你所在的分支级别(显示你在树下的深度),这可能会变得更清晰一点,代码是相同的,但我添加了一个整数'depth',它被打印出来out以显示树中的深度,这应该有助于使递归工作更加清晰..

e.g。

package com.mkyong.seo;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile2 {

public static void main(String[] args) {

try {

File file = new File("/Users/mkyong/staff.xml");

DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance()
                         .newDocumentBuilder();

Document doc = dBuilder.parse(file);

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

if (doc.hasChildNodes()) {

    printNote(doc.getChildNodes(), 1);

}

} catch (Exception e) {
System.out.println(e.getMessage());
}

}

private static void printNote(NodeList nodeList, int depth) {

for (int count = 0; count < nodeList.getLength(); count++) {

Node tempNode = nodeList.item(count);

// make sure it's element node.
if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

    // get node name and value
    System.out.println(depth + "\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
    System.out.println(depth + "Node Value =" + tempNode.getTextContent());

    if (tempNode.hasAttributes()) {

        // get attributes names and values
        NamedNodeMap nodeMap = tempNode.getAttributes();

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

            Node node = nodeMap.item(i);
            System.out.println("attr name : " + node.getNodeName());
            System.out.println("attr value : " + node.getNodeValue());

        }

    }

    if (tempNode.hasChildNodes()) {

        // loop again if has child nodes
        printNote(tempNode.getChildNodes(), depth+1);

    }

    System.out.println(depth + "Node Name =" + tempNode.getNodeName() + " [CLOSE]");

}

}

}

}

答案 1 :(得分:0)

您告诉它以递归方式打印文档根节点的所有子节点。你得到了你所要求的。为什么你认为应该停止?