応用 java(java/xml) 第 8 回
DESCRIPTION
応用 Java(Java/XML) 第 8 回. 2005 年 6 月 9 日 植田龍男. 前回の復習. DOM の応用 DOM ツリー内の検索処理 DOM ツリーの編集 ツリーの視覚化 (Swing 使用 ). 検索処理の例(要素名の検索). public void search( Node node ) { if( node.getNodeName().equals( “ A ” ) ) print( node ); NodeList list = node.getChildNodes(); - PowerPoint PPT PresentationTRANSCRIPT
応用 Java(Java/XML) 第 8 回
2005 年 6 月 9 日植田龍男
前回の復習 DOM の応用 DOM ツリー内の検索処理 DOM ツリーの編集 ツリーの視覚化 (Swing 使用 )
検索処理の例(要素名の検索)
public void search( Node node ) { if( node.getNodeName().equals(“A”) ) print( node ); NodeList list = node.getChildNodes(); if( list.getLength() == 0 ) return; for( int i=0; i<list.getLength(); i++ ) { search( list.item(i)); } }
宿題の答え(属性の検索 1)public void search( Node node, String name ) { if( node.getNodeType() == Node.ELEMENT_NODE ) { Attr attr = searchAttr( node, name ); if( attr != null ) printFullName( node, attr ); } NodeList list = node.getChildNodes(); if( list.getLength() == 0 ) return; for( int i=0; i<list.getLength(); i++ ) { search( list.item(i), name ); } }
宿題の答え(属性の検索 2 )public Attr searchAttr( Node node, String name ) { NamedNodeMap nnp = node.getAttributes(); for( int i=0; i<nnp.getLength(); i++ ) { Node n = nnp.item( i ); if( n.getNodeType() == Node.ATTRIBUTE_NODE ) { Attr a = (Attr)n; if( a.getName().equals( name ) ) return a; } } return null; }
DOM の検索プログラムの問題点
検索パターンは複雑 そのすべてに対応するプログラムも複
雑 何か手助けはないか? みんなが利用できる「標準」の方法が
望ましい => XPath
XPath とは? XML 文書のノードの位置を指定 検索の強力な手段 XSLT Xindice
XPath の検索パターン (1)
child::abc abc child::text() child::* preceding-sibling::abc following-sibling::abc attribute::xyz
XPath の検索パターン (2)
child::*/child::abc ancestor::abc decendant::abc
XPath の検索パターン (3)
child::abc[position()=1] child::abc[attribute::xyz]
XPath の検索パターン (4)
abc //abc abc[1] @xyz
J2SE 5.0 と XML API javax.xml javax.xml.parsers javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stream javax.xml.xpath javax.xml.namespace javax.xml.validation javax.xml.datatype
javax.xml の思想 多数のパーサの実装を統合する枠組み パーサの実装に非依存なアプリケーシ
ョン 実現のために抽象化されたクラス群を
定義 共通の「デザインパターン」
javax.xml.xpath 実装に依存しない Xpath の処理 XPath インターフェイス 検索の処理のメソッドを定義 XPathFactory クラス XPathConstants などのクラス
参考:パーサの取得のパターンDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder();
実装に依存しない XPath の取得
import javax.xml.xpath.*; : XPathFactory xpf = XPathFactory.newInstance(); XPath xpath = xpf.newXPath(); :
evaluate() メソッドの4パターン
対象となるノード Imputsource(XML 文書 ) Node (文書の一部 ) 返り値:単純な String or 特定のデータ型 (Object)
evaluate() メソッドの役割(1)
必要な型のデータを受け取るDocument document = db.parse( new InputSource( "sample3.xml" );
NodeList list = (NodeList)xpath.evaluate( "//ABC" , document, XPathConstants.NODESET );
evaluate() メソッドの役割(2)
必要な型のデータを受け取る
double d = (Double)xpath.evaluate( "//image/@width", new InputSource( "sample3.xml" ), XPathConstants.NUMBER );
ここまでやってきたこと XML パーサ (parser) の概念 パーサの規格 (SAX,DOM)
これからの目標 XPath XSLT 名前空間 (Namespace) XML 文書の妥当性の検証 DTD,XML Schema