• Navigation
  • # COMPUTING
  • # PROGRAMMING
  • # WEB
  • # XML

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112

    Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • XML

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • XPath

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • XSLT

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • DTD

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • XML Schema

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • Namespace

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • DOM

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • SAX

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • SOAP

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • WSDL

  • Deprecated: Function split() is deprecated in /virtual/technotype/public_html/www.technotype.net/tutorial/tutorial.php on line 112
  • XML Canonicalization
  • # DATABASE
  • # NETWORK
  • # LINUX
  • # GRAPHICS
  • # EMBEDDED
  • # TRANSLATION
  • # ARCHIVES
DOM
Java approach to DOM
Traversing the node tree
ノードツリーの走査

ノードツリー(DOMツリー)を走査して目的のノードを探索します。 ノードツリーの走査はノードまたはノード集合を取得してノードを移動していくことで行います。

1. ノードツリーを走査するメソッド(Methods for traversing the node tree)

ノードツリーへのアクセスはDocumentオブジェクトから行います。 ノードツリー全体を現すDocumentオブジェクトからルート要素を取得するにはgetDocumentElementメソッドを使います。 ノード走査ではメソッドでノードまたはノード集合を取得することで探索範囲を移動します。 そのためDOMでは親ノードを取得するためのgetParentNodeメソッド、 子ノードを取得するためのgetChildNodesgetFirstChildgetLastChildメソッド、 兄弟ノードを取得するためのgetPreviousSiblinggetNextSiblingメソッドなどが定義されています。

説明インタフェース
ルート要素の取得DocumentElement rootElement = doc.getDocumentElement();
タグ名が一致する要素ノードのリストを取得DocumentNodeList list = node.getElementsByTagName("string");
タグ名が一致する子孫ノードのリストを取得ElementNodeList list = node.getElementsByTagName("string");
最初の子ノードを取得NodeNode firstChildNode = parentNode.getFirstChild();
最後の子ノードを取得NodeNode lastChildNode = parentNode.getLastChild();
直後の兄弟ノードを取得NodeNode nextChildNode = childNode.getNextSibling();
直前の兄弟ノードを取得NodeNode prevChildNode = childNode.getPreviousSibling();
子ノードリストを取得NodeNodeList list = parentNode.getChildNodes();
要素に従属する属性リストを取得NodeNamedNodeMap map = elementNode.getAttributes();
リストからノードを取得NodeListNode node = list.item(index);
リスト内のノード数を取得NodeListint count = list.getLength();
マップからノードを取得NamedNodeMapNode node = list.item(index);
マップ内のノード数を取得NamedNodeMapint count = list.getLength();
指定した属性名の属性ノードを取得ElementAttr attr = elementNode.getAttributeNode("string");
属性が従属する要素ノードを取得AttrElement ownerElement = attr.getOwnerElement();
ノードが属するDocumentを取得NodeDocument ownerDocument = node.getOwnerDocument();
リストから名前でノードを取得NamedNodeMapNode node = map.getNamedItem("string");
2. 全てのノード名を表示(Displays all the node name)

getFirstChildとgetNextSiblingメソッドを使い、 最初の子ノードから順に全てのノード名を表示するプログラムを以下に示します。

java : Displays all the node name example
import java.io.*; /* データの入出力 */ import org.w3c.dom.*; /* DOM */ import javax.xml.parsers.*; /* XML文書処理 */ public class DOMJAVADisplaysAllTheNodeName { public static void main(String args[]){ try{ File readXML = new File("XMLdocument.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(readXML); Element root = doc.getDocumentElement(); /* ルート要素の取得 */ String name = root.getNodeName(); /* ノード名を取得 */ System.out.println("ノード名:" + name); traverse(root); /* 全てのノードをたどる */ } catch(Exception e){ /* Exception例外クラス */ e.printStackTrace(); /* スタックトレースの出力 */ } } /* DOMツリー走査 */ public static void traverse(Node re){ /* 子ノードが終わるまでループ */ for(Node fc = re.getFirstChild(); fc != null; fc = fc.getNextSibling()){ String name = fc.getNodeName(); /* ノード名を取得 */ if(fc.getNodeType() == Node.ELEMENT_NODE){/* 要素ノードなら */ System.out.println("ノード名:" + name); traverse(fc); /* 再帰呼び出し */ } } } }
console : 
ノード名:customers ノード名:customer ノード名:name ノード名:address ノード名:mail ノード名:tel ノード名:customer ノード名:name ノード名:address ノード名:mail ノード名:tel ノード名:customer ノード名:name ノード名:address ノード名:mail ノード名:tel

getLastChildとgetPreviousSiblingメソッドを使い、 最後の子ノードから順に全てのノード名を表示するプログラムを以下に示します。

java : Displays all the node name 02 example
import java.io.*; /* データの入出力 */ import org.w3c.dom.*; /* DOM */ import javax.xml.parsers.*; /* XML文書処理 */ public class DOMJAVADisplaysAllTheNodeName02 { public static void main(String args[]){ try{ File readXML = new File("XMLdocument.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(readXML); Element root = doc.getDocumentElement(); /* ルート要素の取得 */ String name = root.getNodeName(); /* ノード名を取得 */ System.out.println("ノード名:" + name); traverse(root); /* 全てのノードをたどる */ } catch(Exception e){ /* Exception例外クラス */ e.printStackTrace(); /* スタックトレースの出力 */ } } /* DOMツリー走査 */ public static void traverse(Node re){ /* 子ノードが終わるまでループ */ for(Node lc = re.getLastChild(); lc != null; lc = lc.getPreviousSibling()){ String name = lc.getNodeName(); /* ノード名を取得 */ if(lc.getNodeType() == Node.ELEMENT_NODE){/* 要素ノードなら */ System.out.println("ノード名:" + name); traverse(lc); /* 再帰呼び出し */ } } } }

getChildNodesとgetLengthプメソッドを使い、 子ノードリストから順に全てのノード名を表示するプログラムを以下に示します。

java : Displays all the node name 03 example
import java.io.*; /* データの入出力 */ import org.w3c.dom.*; /* DOM */ import javax.xml.parsers.*; /* XML文書処理 */ public class DOMJAVADisplaysAllTheNodeName03 { public static void main(String args[]){ try{ File readXML = new File("XMLdocument.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(readXML); Element root = doc.getDocumentElement(); /* ルート要素の取得 */ String name = root.getNodeName(); /* ノード名を取得 */ System.out.println("ノード名:" + name); traverse(root); /* 全てのノードをたどる */ } catch(Exception e){ /* Exception例外クラス */ e.printStackTrace(); /* スタックトレースの出力 */ } } /* DOMツリー走査 */ public static void traverse(Node re){ NodeList cnList = re.getChildNodes(); /* 子ノードのリストを取得 */ int count = cnList.getLength(); /* リスト内の子ノードの数 */ for(int i=0; i<count; i++){ /* 子ノードの数だけループ */ Node cn = cnList.item(i); /* ノードリストから取り出す */ String name = cn.getNodeName(); /* ノード名を取得 */ if(cn.getNodeType() == Node.ELEMENT_NODE){/* 要素ノードなら */ System.out.println("ノード名:" + name); traverse(cn); /* 再帰呼び出し */ } } } }
3. ノード名を使ったアクセス(Accessing the elements by name)

getElementsByTagNameメソッドを使い指定したタグ名を持つ要素ノードのリストを取得します。 そのリストに含まれる要素ノードの名前とテキストノードの値を表示するプログラムを以下に示します。

java : Accessing the elements by name example
import java.io.*; /* データの入出力 */ import org.w3c.dom.*; /* DOM */ import javax.xml.parsers.*; /* XML文書処理 */ public class DOMJAVAAccessingTheElementsByName { public static void main(String args[]){ try{ File readXML = new File("XMLdocument.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(readXML); Element root = doc.getDocumentElement(); /* ルート要素の取得 */ /* タグ名に一致した要素ノードのリストを返す */ NodeList etn = root.getElementsByTagName("address"); int count = etn.getLength(); /* リスト内の子ノードの数 */ for(int i=0; i<count; i++){ /* ノード数だけループ */ Node cn = etn.item(i); /* ノードリストから取り出す */ traverse(cn); /* DOMツリー走査 */ } } catch(Exception e){ /* Exception例外クラス */ e.printStackTrace(); /* スタックトレースの出力 */ } } /* DOMツリー走査 */ public static void traverse(Node re){ NodeList cnList = re.getChildNodes(); /* 子ノードのリストを取得 */ int count = cnList.getLength(); /* リスト内の子ノードの数 */ for(int i=0; i<count; i++){ /* 子ノードの数だけループ */ Node cn = cnList.item(i); /* ノードリストから取り出す */ String name = cn.getNodeName(); /* ノード名を取得 */ String value = cn.getNodeValue(); /* ノード値を取得 */ if(cn.getNodeType() == Node.ELEMENT_NODE){/* 要素ノードなら */ System.out.print("[ELEMENT_NODE:" + name + "]/"); } else if(cn.getNodeType() == Node.TEXT_NODE){ if(value.trim().length() != 0){ System.out.println(name + "." + value); } } traverse(cn); /* 再帰呼び出し */ } } }
console : 
[ELEMENT_NODE:mail]/#text.user1@server.pro.ne.jp [ELEMENT_NODE:tel]/#text.000-0000-000* [ELEMENT_NODE:mail]/#text.user2@server.pro.ne.jp [ELEMENT_NODE:tel]/#text.000-0000-00*0 [ELEMENT_NODE:mail]/#text.user3@server.pro.ne.jp [ELEMENT_NODE:tel]/#text.000-0000-0*00
4. 属性へのアクセス(Accessing the attributes)

要素ノードに従属する属性はgetAttributesメソッドを使い取り出します。 このメソッドはノードマップを返します。 また属性から名前や値を取り出すにはgetName、getValueメソッドを使用します。

java : Accessing the attributes example
import java.io.*; /* データの入出力 */ import org.w3c.dom.*; /* DOM */ import javax.xml.parsers.*; /* XML文書処理 */ public class DOMJAVAAccessingTheAttributes { public static void main(String args[]){ try{ File readXML = new File("XMLdocument.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(readXML); Element root = doc.getDocumentElement();/* ルート要素の取得 */ traverse(root); /* DOMツリー走査 */ } catch(Exception e){ /* Exception例外クラス */ e.printStackTrace(); /* スタックトレースの出力 */ } } /* DOMツリー走査 */ public static void traverse(Node re){ NodeList cnList = re.getChildNodes(); /* 子ノードのリストを取得 */ int count = cnList.getLength(); /* リスト内の子ノードの数 */ for(int i=0; i<count; i++){ /* 子ノードの数だけループ */ Node cn = cnList.item(i); /* ノードリストから取り出す */ String name = cn.getNodeName(); /* ノード名を取得 */ String value = cn.getNodeValue(); /* ノード値を取得 */ if(cn.getNodeType() == Node.ELEMENT_NODE){/* 要素ノードなら */ System.out.println("ELEM_NODE:" + name); NamedNodeMap map = cn.getAttributes();/* 属性のノードマップ取得 */ for(int j=0; j<map.getLength(); j++){/* ノード数だけループ */ Node node = map.item(j); /* マップから取り出し */ Attr at = (Attr)node; /* キャスト */ String atName = at.getName(); /* 属性名を取得 */ String atValue = at.getValue(); /* 属性値を取得 */ System.out.println("ATTR_NODE:" + atName + "{" + atValue + "}"); } } else if(cn.getNodeType() == Node.TEXT_NODE){ if(value.trim().length() != 0){ System.out.println("TEXT_NODE:" + name + "{" + value + "}"); } } traverse(cn); /* 再帰呼び出し */ } } }
console : 
ELEM_NODE:customer ATTR_NODE:number{0001} ELEM_NODE:name TEXT_NODE:#text{Spring} ELEM_NODE:address ELEM_NODE:mail TEXT_NODE:#text{user1@server.pro.ne.jp} ELEM_NODE:tel TEXT_NODE:#text{000-0000-000*} ELEM_NODE:customer ATTR_NODE:number{0002} ELEM_NODE:name TEXT_NODE:#text{Summer} ELEM_NODE:address ELEM_NODE:mail TEXT_NODE:#text{user2@server.pro.ne.jp} ELEM_NODE:tel TEXT_NODE:#text{000-0000-00*0} ELEM_NODE:customer ATTR_NODE:number{0003} ELEM_NODE:name TEXT_NODE:#text{Autumn} ELEM_NODE:address ELEM_NODE:mail TEXT_NODE:#text{user3@server.pro.ne.jp} ELEM_NODE:tel TEXT_NODE:#text{000-0000-0*00}