DOMと文書のツリー構造

Download Report

Transcript DOMと文書のツリー構造

第7回 2007年6月8日
「XMLパーサ」-- Java でXMLを処理
javax.xml.stream パッケージのパーサ
SAX(Simple API for XML) のパーサ
 応用(1) – テーブルの利用
「要素の出現回数を調べる」
 応用(2) – フィルタ的な処理





DOMによる処理
応用:ツリー構造の視覚化
javax.swing.JTree
javax.xml.stream
XMLEventReader インタフェース
XMLInputFactory クラス
 javax.xml.stream.events
XMLEvent インタフェース
サブインタフェース群

javax.xml.parsers
SAXParser, SAXParserFactory
 org.xml.sax
XMLReader, InputStream
 最も初期から利用可能だったパーサ

SAXParserFactory spf =
SAXParserFactory.newInstance();
SAXParser parser =
spf.newSAXParser();
XMLReader reader =
parser.getXMLReader();
XML文書を読み込みながら処理
特定の「節目」でイベントが発生
(イベント駆動型の処理)
 イベントの処理はHandlerが担当
ContentHandler(のサブクラス)
ErrorHandler(のサブクラス)


XMLReader reader =
parser.getXMLReader();
reader.setContentHandler(
new MyContentHandler() );
reader.setErrorHandler(
new MyErrorHandler() );
XMLReader reader ….
:
InputSource source =
new InputSource( “sample.xml” );
reader.parse( source );
XML文書の読み込みと処理が並行に
進行
 要素(タグ)ごとに逐次処理
 読み込みと処理は同時に終了
(後処理には別の機構が必要)

startDocument() – パーシングの開始時
 endDocument() – パーシングの終了時
 startElement() – 要素(タグ)の開始
 endElement() – 要素(タグ)の終了
 characters() – 平文テキストの読み込み

3つのエラーレベル
fatalError
文書名の間違い、不存在
XML文書として不適切(文法エラー)
 error
XML文書の設計に不適合(非妥当性)
 warning
エラーではない不適切な記述


DOM(Document Object Model )
 文書の構造を記述(DOMツリー)

DocumentBuilderFactory bf =
DocumentBuilderFactory.newInstance();
DocumentBuilder db =
dbf.newDocumentBuilder();
XML文書の一括読み込み
(処理は読み込み完了後)
 XML文書の構造をツリーとしてメモ
リ上に記憶
 DOMツリーの動的な変更も可能

処理の手順
SAX:文書の頭から逐次処理
DOM:一括読み込み後ランダムアクセス
 適した用途
SAX: 内容の取り出し、フィルタ的処理
DOM: 文書の構造の利用、編集
 システムへの負荷
SAX:比較的低い DOM:メモリ必要



org.w3c.dom.Node インタフェース
主要な Node のサブインタフェー
ス
Document
Document
Element
Element
Text
Element
Element
Attr
Attr
Element
Text
Text
Attr
<document>
<title>Java and XML</title>
Let's begin, now!
<image source="java.png" width="512"
height="400"/>
</document>
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));
}
}
要素の開始タグ内部に記述
 個数は任意、出現順序は意味を持たない
 「名前(name)」と「値(value)」のペアの
集まり

<image source=“java.png” width=“200”
height=“300”></image>
属性も Nodeのサブインタフェース
Attr
 属性の取り出しには Nodeの集合
NamedNodeMap
重複しない名前を指定
インデックス番号による管理

if( node.getNodeType() ==
Node.ELEMENT_NODE ) {
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;
System.out.print( "[" + a.getName()
+ "=" + a.getValue() + "]" );
}
}
NamedNodeMap の要素は一般に Node
(形式上は Attr のみが対象ではない)
 getAttributes()メソッドは Nodeで定義
(しかし、Element以外では無意味)
 他の属性を扱うメソッドはElementで定義
getAttribute(), setAttribute()

javax.swing.JTree クラス
javax.swing.tree パッケージ
DefaultMutableTreeNode
クラス
 javax.swing.event パッケー
ジ


dbf =DocumentBuilderFactory.newInstance();
db = dbf.newDocumentBuilder();
Document doc = db.parse( source );
Node rootTag = doc.getFirstChild();
root = newDefaultMutableTreeNode(
rootTag.getNodeName() );
tree = new JTree( root );
addToTree( rootTag, root );
public void addToTree( Node node,
DefaultMutableTreeNode branch ) {
:
DefaultMutableTreeNode tn =
new DefaultMutableTreeNode(
child.getNodeName() );
branch.add( tn );
addChildren( child, tn );