2014-01-24 65 views
-1

爲什麼代碼繼續打印元素,當它打印的列表中只有1個元素時?爲什麼代碼繼續打印元素,當它打印的列表中只有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]"); 

    } 

    } 

    } 

} 

OUTPUT: -

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] 

第一次。

請幫

+0

「/Users/mkyong/staff.xml」,親愛的先生。你有嗎? – crnlx

+0

是的,我有我的xml。我已經發布了它 – Ankit

+0

我問過它先生。我無法得到爲什麼我在第一個名字後得到輸出,因爲該時間點上的節點列表只保留1個文本節點。 – Ankit

回答

0

你告訴它來打印文檔根節點的孩子,遞歸。你正在得到你所要求的。你爲什麼認爲它應該停止?

1

您正在瀏覽XML,好像它是一棵樹,一次沿着每個分支走。你打印的列表中只有1個元素的原因是因爲在該分支中,你處於元素firstname,其中有1個子元素,當該元素結束執行時,文本節點會顯示'low',則返回上一個分支,然後轉到該元素的下一個子元素(姓氏)。如果你添加一些東西來顯示你所在的分支的級別(以顯示你在樹下有多深),代碼是相同的,但是我已經添加了一個整數「深度」,這將被打印出來以顯示樹中的深度,這應該有助於它更清楚地說明遞歸如何工作。

eg

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]"); 

} 

} 

} 

}