- PR -

DOM+XPathの処理をSAXを用いて行ないたい

1
投稿者投稿内容
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 2004-08-16 15:49
下記のプログラムのように、DOM+XPathを用いて行なっていた処理を
SAXを用いて行ないたいと考えております。行ないたい事は、

XML文書で、/address/item/name のテキスト部分の値を取り出す事です。

調べたところ、XPointerはXLinkを見つけましたが、XPathとは
趣旨が異なる様です。

SAXのハンドラーに、以下の様に、登録をしておけばよいのでしょうか?

public void hogeElement(ここに、/address/item/name 等を書く) throws SAXException {
System.out.println("Hoge");
}

記述し方のイメージがわかないので、
どなたかご存知の方がいらっしゃいましたら
ご教授下さい。



--------------

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.w3c.dom.traversal.*;
import org.apache.xpath.*;

class XPathDemo {

private static final String SUBJECTATTRIBUTE =
"//*[namespace-uri()='urn:oasis:names:tc:xacml:1.0:context' and local-name()='item']/*[namespace-uri()='urn:oasis:names:tc:xacml:1.0:context' and local-name()='name']";

private static final String XMLDOCUMENT = "C:\\eclipse-SDK-2.1.2-win32-2\\eclipse\\workspace\\sample\\baseXMLDocument\\XPathDemo2.xml";

public static void main(String[] args) {
try {
// DOMパーサ用ファクトリの生成
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
// 名前空間を認識する
factory.setNamespaceAware(true);
// DOM Documentインスタンス用ファクトリの生成
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析とDocumentインスタンスの取得
Document doc = builder.parse(XMLDOCUMENT);

// NodeIteratorの取得
NodeIterator nl =
XPathAPI.selectNodeIterator(doc, SUBJECTATTRIBUTE);

int count = 0;
Node n;

while ((n = nl.nextNode()) != null) {
count++;

System.out.println("node_name = " + n.getNodeName());

System.out.println("node_value = " + n.getNodeValue());
System.out.println(
"node_value = " + n.getFirstChild().getNodeValue());
}
System.out.println("counts: " + count);

} catch (Exception e) {
e.printStackTrace();
}
}
}

----------

<?xml version="1.0" encoding="UTF-8"?>
<address xmlns="urn:oasis:names:tc:xacml:1.0:context">
<item sex="male" custid="E21099">
<name>菅井 学</name>
<access kind="email"></access>
<access kind="url">http://msugai.fc2web.com/java/</access>
<image file="msugai.png" />
</item>
<item sex="male" custid="E27989">
<name>鈴木 竜広</name>
<access kind="email">tsuzuki@hoge.foo.bar</access>
<image file="tsuzuki.png" />
</item>
<item sex="female" custid="E29435">
<name>栃原 宏枝</name>
<access kind="tel">090-xxxx-xxxx</access>
<image file="tochi.png" />
</item>
</address>
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-08-17 09:26
XMLfilter
で検索するといいかも、 ほとんどXSLT のfor-each で,すむ処理みたいですが。
========================
ストリーム変形は検索すると色々でます

データ更新が可能なXML編集ライブラリ
http://www.csg.is.titech.ac.jp/paper/rei-bachelor2004.ppt
http://www.csg.is.titech.ac.jp/paper/rei-bachelor2004.pdf

STX
http://www.excite.co.jp/world/english/web/body/?wb_url=stx.sourceforge.net&submit=%83E%83F%83u%83y%81%5B%83W%96%7C%96%F3&wb_lp=ENJA&wb_dis=2&wb_co=excitejapan
=====================================================
巨大データなら、XML−DB に入れて問い合わせになるでしょう
-------------------------------------------------
処理の発想が Pull 型ですから(SAX の push型とは違う)。
そのようなAPIを使うとか、いっそ、自動化して、Javaバインディング
ではどうでしょう。「検索すると多数出ます。」
http://www.xml.com/lpt/a/2004/08/18/xstream.html
では、例
Deserializing XML to Objects
class Date {
int year;
int month;
int day;
}
に対して
<date>
<year>2004<year>
<month>8<month>
<day>15<day>
<date>
を、以下のように読み込む。
import com.thoughtworks.xstream.XStream;
Date newdate = (Date)xstream.fromXML(xml);
のが、載っています。
SAX2 を使って基礎から建物を作るのでなければ、一般人向きです。

[ メッセージ編集済み 編集者: MMX 編集日時 2004-08-20 10:09 ]
1

スキルアップ/キャリアアップ(JOB@IT)