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>
戻る