2013-11-28 7 views
13

ルートノードの子要素を印刷します。これは私のXMLファイルです。ルートノードの子ノードとして余分なテキストノードを取得するのはなぜですか?

<?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> 

私の理解によると、ルートノードは、「会社とその子ノードが( 'スタッフのノード2回があるので)「スタッフ」と「スタッフ」でなければなりませんです。しかし、私は私のJavaコードを介してそれらを取得しようとしているとき私は5子ノードを取得しています。 3つの余分なテキストノードはどこから来ていますか?

Javaコード:

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 

なぜ3つのテキストノードがこちらに来ていますか?

答えて

25

なぜ3つのテキストノードがここに来るのですか?

子供の間の空白は、の要素です。

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

それとも、その空白を持たないためにあなたの文書を変更することができます:あなたが唯一の子要素が必要な場合は、単に他のタイプのノードを無視すべきです。

別のXML APIを使用して、要素を簡単に求めることができます。

要素コンテンツの空白を無視する場合は、Text.isElementContentWhitespaceを使用できます。

+0

ありがとうございます!それは働いた:)もう一つ、それはテキストノードとして改行文字を取っている。改行文字は空白ですか? XMLファイルに改行文字を置く必要があり、改行文字をテキストノードとして表示しているため、子要素だけを取得し、テキストノードを出力する方法はありません。 –

+0

@VikasMangal:はい、改行は空白です。私の答えは要素だけを見るためのコードを含んでいます。 –

+0

ありがとうございました:) –

関連する問題