DOMを使ってXML文書をトラバースする

戻る

■実行結果

$ java -cp . DOMTraverser
menu 設定
  menu アイテム
    menu_item アイテムロード
      command: LOAD_ITEM
    menu_item アイテム保存
      command: SAVE_ITEM
  menu デバイス
    menu_item デバイス設定
      command: SET_DEVICE
    menu_item PING
      command: PING
  menu プロセス
    menu_item プロセス作成
      command: CREATE_PROCESS
    menu_item プロセス編集
      command: EDIT_PROCESs
    menu_item プロセス保存
      command: SAVE_PROCESS
  menu_item 終了
    command: EXIT
menu テストラン
  menu_item 機能A
    command: FUNCTION_A
  menu_item 機能B
    command: FUNCTION_B
  menu_item 機能C
    command: FUNCTION_C
  menu_item 機能D
    command: FUNCTION_D
  menu_item 機能E
    command: FUNCTION_E


::::::::::::::
DOMTraverser.java
::::::::::::::
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;

/**
$Id: dom_traversal.html,v 1.1 2009/06/22 16:12:09 kishi Exp kishi $
DOMを使ってXML内の全要素の属性、値を取得
*/

public class DOMTraverser {

    public DOMTraverser( String fileName ) throws Exception {
        try {
            // ドキュメントビルダーファクトリを生成
            DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();

            // ドキュメントビルダーを生成
            DocumentBuilder builder = dbfactory.newDocumentBuilder();

            // パースを実行してDocumentオブジェクトを取得
            Document document = builder.parse( new File( fileName ) );

            Node node = document.getDocumentElement();
            traverse( node, 0 );

        } catch ( Exception e ) {
            throw e;
        }
    }

    private void traverse( Node node, int layer ) {
        // 子要素のリストを取得
        Node childNode = node.getFirstChild();

        while ( childNode != null ) {
            String nodeName = childNode.getNodeName();

            if ( nodeName.equals( "command" ) ) {
                String commandValue = childNode.getFirstChild().getNodeValue();
                // インデントする
                indent( layer );
                System.out.println( "command: " + commandValue.trim() );
            }

            if ( nodeName.equals( "menu" ) || nodeName.equals( "menu_item" ) ) {

                // getAttribute()はElementクラスが持つメソッドなのでキャストする必要がある
                String attributeValue = ( ( Element ) childNode ).getAttribute( "name" );

                // インデントする
                indent( layer );
                System.out.println( nodeName + " " + attributeValue );

                if ( childNode.hasChildNodes() ) {
                    traverse( childNode, layer + 1 );
                }
            }

            childNode = childNode.getNextSibling();

        }
    }

    private void indent( int layer ) {
        for ( int i = 0;i < layer;i++ ) {
            System.out.print( "  " );
        }
    }

    public static void main( String[] args ) throws Exception {

        DOMTraverser traverser = new DOMTraverser( "menu.xml" );

    }
}


::::::::::::::
menu.xml
::::::::::::::
<?xml version="1.0" encoding="Shift_JIS" ?>
<root>
	<menu name="設定">
		<menu name="アイテム">
			<menu_item name="アイテムロード">
				<command>LOAD_ITEM</command>
			</menu_item>
			<menu_item name="アイテム保存">
				<command>SAVE_ITEM</command>
			</menu_item>
		</menu>
		<menu name="デバイス">
			<menu_item name="デバイス設定">
				<command>SET_DEVICE</command>
			</menu_item>
			<menu_item name="PING">
				<command>PING</command>
			</menu_item>
		</menu>
		<menu name="プロセス">
			<menu_item name="プロセス作成">
				<command>CREATE_PROCESS</command>
			</menu_item>
			<menu_item name="プロセス編集">
				<command>EDIT_PROCESs</command>
			</menu_item>
			<menu_item name="プロセス保存">
				<command>SAVE_PROCESS</command>
			</menu_item>
		</menu>
		<menu_item name="終了">
			<!-- EXITは予約語です --> 
			<command>
			EXIT
			</command>
		</menu_item>
	</menu>
	<menu name="テストラン">
			<menu_item name="機能A">
				<command>FUNCTION_A</command>
			</menu_item>
			<menu_item name="機能B">
				<command>FUNCTION_B</command>
			</menu_item>
			<menu_item name="機能C">
				<command>FUNCTION_C</command>
			</menu_item>
			<menu_item name="機能D">
				<command>FUNCTION_D</command>
			</menu_item>
			<menu_item name="機能E">
				<command>FUNCTION_E</command>
			</menu_item>
	</menu>

</root>
戻る inserted by FC2 system