web-dev-qa-db-ja.com

ルートノードの子ノードとして追加のテキストノードを取得するのはなぜですか?

ルートノードの子要素を印刷したい。これは私のXMLファイルです。

<?xml version="1.0"?>
<!-- Comment-->
<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();
    }

}

}

出力:

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

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

22
Vikas Mangal

なぜ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を使用することもできます。 (DOM APIはさまざまな面で苦痛です。)

要素のコンテンツの空白のみを無視したい場合は、 Text.isElementContentWhitespace

32
Jon Skeet