- - PR -
DOM+XPathの処理をSAXを用いて行ないたい
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 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> |
|
投稿日時: 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
