応用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()
© Copyright 2024 ExpyDoc