DOMによる属性の処理

応用Java(Java/XML) 第6回
2005年5月26日
植田龍男
XML文書の処理




XMLパーサ(parser)の概念
パーサの規格(SAX,DOM、他)
SAX(Simple API for XML)
文書を逐次処理、要素を個別に扱う
DOM(Document Object Model)
文書を一括読み込み、構造を扱う
javax.xml.parsers




パーサを「取り出す」ための仕組みを提供
SAXParser,
SAXParserFactory
DocumentBuilder,
DocumentBuilderFactory
アプリケーションはパーサの実装に非依存
パーサの取得のパターン
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
DocumentBuilder db =
dbf.newDocumentBuilder();
DOMの処理の特徴
XML文書の一括読み込み
(処理は読み込み完了後)
 XML文書の構造をツリーとしてメモリ上に
記憶
 DOMツリーの動的な変更も可能

単純なツリー構造


親と子
親は1人のみ、子は複数
例)
ファイルシステム(ディレクトリとファイル)
Javaの継承関係
3Dのモデリング
XMLの文書
ノード(Node)の概念




Node – Node – Node
親のノードと子のノード
自分の親をたどる
自分のすべての子をたどる
Root
Node
Node
Leaf
Node
Leaf
DOMツリーの表現


org.w3c.dom.Node インタフェース
主要な Node のサブインタフェース
Document
Document
Element
Element
Attr
Text
Element
Element
Text
Attr
Attr
Element
Text
XML文書の構造の例
<document>
<title>Java and XML</title>
Let's begin, now!
<image source="java.png" width="512"
height="400"/>
</document>
DOMツリーによる表現
Document
Element<document>
Element<title>
Text “Java and…”
Text ”Let’s Begin…”
Attributes
Element<image>
ノードとしての性質


階層構造(親子関係)
getParentNode()
getChildNodes()
再帰的呼び出しによる処理
再帰的な呼び出しの例
public void printNode( Node node ) {
NodeList list = node.getChildNodes();
if( list.getLength() == 0 ) return;
for( int i=0; i<list.getLength(); i++ ) {
printNode( list.item(i));
}
}
XMLにおける「属性(Attribute)」



要素の開始タグ内部に記述
個数は任意、出現順序は意味を持たない
「名前(name)」と「値(value)」のペアの集まり
<image source=“java.png” width=“200”
height=“300”></image>
属性(Attribute)の扱い


属性も Nodeのサブインタフェース
Attr
属性の取り出しには Nodeの集合
NamedNodeMap
重複しない名前を指定
インデックス番号による管理
属性を扱う例(1)
if( node.getNodeType() ==
Node.ELEMENT_NODE ) {
NamedNodeMap nnp =
node.getAttributes();
}
属性を扱う例(2)
for( int i=0; i<nnp.getLength(); i++ ) {
Node n = nnp.item( i );
if( n.getNodeType() ==
Node.ATTRIBUTE_NODE ) {
Attr a = (Attr)n;
System.out.print( "[" + a.getName()
+ "=" + a.getValue() + "]" );
}
}
補足
NamedNodeMap の要素は一般に Node
(形式上は Attr のみが対象ではない)
 getAttributes()メソッドは Nodeで定義
(しかし、Element以外では無意味)
 他の属性を扱うメソッドはElementで定義
getAttribute(), setAttribute()
