@634

634 - JAXP - DOM - スペースをDOMツリーに取り込まない

Advertisement

スペースを要素として取り込むDOMツリー

インデントしてあるXML文章からDOMツリーを生成すると、スペースやタブがDOMツリーの要素として取り込まれてしまう(例1参照)

例1:スペースを含むDOMツリー

booklist.xml
<?xml version="1.0" ?>
<booklist>
    <book>英会話の本</book>
    <book>政治の本</book>
</booklist>

DOMツリーを生成するプログラム(ReadBookList.java)
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class ReadBookList {
    public static void main(String[] args){
        try{
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dbFactory.newDocumentBuilder();
            Document doc = builder.parse("booklist.xml");

            // ルート要素の取得
            Element root = doc.getDocumentElement();

            // ルート要素以下のノードを取得
            NodeList list = root.getChildNodes();

            // 表示
            for(int i = 0; i < list.getLength(); i++){
                System.out.println("[" + i + "]" + list.item(i));
            }

        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }
    }
}

結果
[0]
[1]英会話の本
[2]
[3]政治の本
[4]
結果から、空白のノードも作成されていることがわかる。

空白を読み込まない

空白を無視するためには二つの手順を踏む必要がある。XMLにDTDを指定する必要があるので、プログラム側だけでは対応することができない。

dtd指定したbooklist.xml
<?xml version="1.0" ?>
<!DOCTYPE booklist [
<!ELEMENT booklist (book)*>
<!ELEMENT book (#PCDATA)>
] >

<booklist>
    <book>英会話の本</book>
    <book>政治の本</book>
</booklist>

続いてDOMツリーを作成するDocumentBuilderFactoryに対して空白を無視するよう指示を与える。これにはsetIgnoringElementContentWhitespaceメソッドを利用する。
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class ReadBookList {
    public static void main(String[] args){
        try{
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

            // 空白を無視
            dbFactory.setIgnoringElementContentWhitespace(true);

            DocumentBuilder builder = dbFactory.newDocumentBuilder();
            Document doc = builder.parse("booklist.xml");

            // ルート要素の取得
            Element root = doc.getDocumentElement();

            // ルート要素以下のノードを取得
            NodeList list = root.getChildNodes();

            // 表示
            for(int i = 0; i < list.getLength(); i++){
                System.out.println("[" + i + "]" + list.item(i));
            }

        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }
    }
}

結果
[0]英会話の本
[1]政治の本
空白部分がツリーに取り込まれていない。

Advertisement

ショートカット

634
このカテゴリのトップページに戻る
634labs
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール