2013-11-28 3 views
13

Ich möchte die untergeordneten Elemente des Stammknotens drucken. Dies ist meine XML-Datei.Warum erhalte ich zusätzliche Textknoten als Kindknoten des Wurzelknotens?

<?xml version="1.0"?> 
<!-- Hi --> 
<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> 

Nach meinem Verständnis, Wurzelknoten ist ‚Unternehmen‘ und der Childknoten muss sein ‚Personal‘ und ‚Personal‘ (wie es ‚Personals‘ Knoten 2 mal ist). Aber wenn ich versuche, sie durch meinen Java-Code zu bekommen, bekomme ich 5 Kindknoten. Woher kommen die 3 zusätzlichen Textknoten?

Java-Code:

package com.training.xml; 

import java.io.File; 


import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 


public class ReadingXML { 


public static void main(String[] args) { 
    try { 

     File file=new File("D:\\TestFile.xml"); 
     DocumentBuilderFactory  dbFactory=DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder=dbFactory.newDocumentBuilder(); 
     Document document=dBuilder.parse(file); 
     document.getDocumentElement().normalize(); 
     System.out.println("root element: "+document.getDocumentElement().getNodeName()); 
     Node rootNode=document.getDocumentElement(); //saving root node in a variable. 
     System.out.println("root: "+rootNode.getNodeName()); 
     NodeList nList=rootNode.getChildNodes(); //to store the child nodes as node list. 
     for(int i=0;i<nList.getLength();i++) 
     { 
      System.out.println("node name: "+nList.item(i).getNodeName()); 
     } 


    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 

}

OUTPUT:

root element: company 
root: company 
node name: #text 
node name: staff 
node name: #text 
node name: staff 
node name: #text 

Warum die drei Textknoten kommen hier vorbei?

Antwort

25

Warum kommen die drei Textknoten hier her?

Sie sind das Leerzeichen zwischen dem Kind Elemente. Wenn Sie nur die untergeordneten Elemente wollen, sollten Sie nur Knoten von anderen Typen ignorieren:

for (int i = 0;i < nList.getLength(); i++) { 
    Node node = nList.item(i); 
    if (node.getNodeType() == Node.ELEMENT_NODE) { 
     System.out.println("node name: " + node.getNodeName()); 
    } 
} 

Oder könnten Sie Ihr Dokument ändern, um nicht das Leerzeichen haben.

Oder Sie könnten eine andere XML-API verwenden, mit der Sie einfach nach Elementen fragen können. (Die DOM-API ist auf verschiedene Arten ein Problem.)

Wenn Sie nur den Inhalt von Element-Inhalten ignorieren möchten, können Sie Text.isElementContentWhitespace verwenden.

+0

Danke! Es hat funktioniert :) Noch eine Sache, es nimmt Newline-Charakter als Textknoten. Newline-Zeichen ist ein Leerzeichen? Gibt es eine Möglichkeit, nur die untergeordneten Elemente und nicht die Textknoten als Ausgabe zu erhalten, weil ich Zeilenumbrüche in meine XML-Datei einfügen muss und darin Zeilenumbrüche als Textknoten anzeigt. –

+0

@VikasMangal: Ja, Zeilenumbrüche sind Leerzeichen. Meine Antwort enthält Code, um nur Elemente zu betrachten. –

+0

Vielen Dank :) –

Verwandte Themen