- PR -

XMLファイルの中身を高速に検索したり、部分的に読み込むには?

投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2005-10-13 08:49
お世話になってます。

今回、はじめてXMLファイルを扱うプログラムをVB.NET 2003で作り始めました。

参考書やネットではよく、1つのXMLファイルを丸ごと読み書きするサンプルを見かけますが、
今作っているのは比較大きなXMLファイルで、そのファイルもあるフォルダ内に複数あり、
フォルダ内のXMLファイルを検索し、そのXMLファイル郡のある一部の情報のリストを一覧
表示したいのです。

いちいち、そのXMLファイル丸ごとデシリアライズして、その一部分のみを画面にリスト表示
するのでは、速度的にも問題があります。

XMLファイルの中身を高速に検索したり、部分的に読み込むには、普通どのようにするので
しょうか?参考になるものはありませんか?


[ メッセージ編集済み 編集者: maru 編集日時 2005-10-13 08:50 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-10-13 10:16
その1:HTML、XML などのマークアップしたテキストに対応する、全文検索エンジンを
使う。
その2:XMLに対応したDBを使う。
少々のWeb検索で出ます
==============================
読み込みの途中打ち切りを求めていますから、一般コマンドには無いでしょう。
CTAGS や 前後行取得できるGREP でテキスト処理でも可能かもしれません。
SED は途中打ち切りの qコマンドを持ってます。
======================
このような用途が WinFS の潜在需要なのでしょうか
Office文書のプロパティの一覧みたいなものを要求してますから
ファイルに多数の属性を付けられる ファイルシステムと言ったら?
======================
入力打ち切り可能なストリーム型のxml API を使うのが、一番正統な回答と
思います
VTD-XML
http://vtd-xml.sourceforge.net/
などは、どうなのでしょう

[ メッセージ編集済み 編集者: MMX 編集日時 2005-10-19 11:51 ]
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2005-10-13 10:52
.NETということであれば、XmlTextReaderを使えばドキュメント丸ごとメモリにロードすることもなく、高速に読み取りができます。
ただ、検索ということになると現行の1.1のXmlTextReaderは機能が乏しいです。
もうすぐ出る2.0版のXmlReaderはかなり機能が拡張されていて、かなり便利です。
今までDOMを使ってやっていたことのたいていのことはこれで置き換えることができます。
出るまで待てれば2.0版をお勧めします。
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2005-10-14 01:15
読み終わったノードの情報を保持しないという特長のあるXmlReaderを使うのが適切なケースです。ただし、いくら何でもXmlReaderがDOMの機能を置き換えるなんて言えません(SelectNodes()とか、出来るんですか?)。.NET 2.0になっても大して変わりませんよ。.NET 1.xでもやれば出来たことばかりです。

XmlDocumentを使って全体を読み込まない方法もあります。特にDBレコードみたいな、兄弟ノードがたくさんあるけど子孫のブランチはそんなに大きくない、というものであれば、XmlDocument.ReadNode()を呼び続けることもできます(読み終わったノードはXmlReaderと同じで破棄されます)。XmlReaderにして<foo/>と<foo></foo>と<foo> </foo>の違いなどで苦しむよりはXmlNodeを使った方が楽だっていうことも十分にあり得ます。DOMで書いてたプログラミングモデルがそのまま使えるかもしれませんし。
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2005-10-14 17:23
さすがにDOMを全て置き換える何てことは思ってませんよ。
まあメソッドの数が大幅に増えた == 大きく変わった
というわけではないでしょうが、私にとっては大して変わってないとは思えず、便利さでは十分かわったと感じています。

ReadToFollowingやReadSubTreeとかReadToNextSiblingなんて私はかなり便利なんですが・・・。
そんなに複雑な条件でなければ SelectNodesあたりは、ReadToFollowingで十分かな。

まあ、現行バージョンでもやろうと思えばできるといってしまえば、ほとんどのこともそう言えてしまいますので。

ここ数ヶ月はずっと.NET2.0で開発してますが、現行のXmlReaderには戻れないです・・・。
まあ、どっちにしても2.0版のXmlReaderはお勧めです。よろしかったらご検討ください。



[ メッセージ編集済み 編集者: karajan 編集日時 2005-10-14 17:24 ]
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2005-10-15 01:09
じゃあ「大抵のこと」などと誇張表現するのは止めた方がいいです。

ReadToFollowing()がSelectNodes()を置き換えられるというのは、一体どういう検索を想定されているのでしょうか。SelectNodes("foo[bar]")のレベルでも、条件に合致したfooに戻れないことを考えたら、XmlReaderは使い物にならないんですけど。

僕は普段XmlReaderは「使える自信があるなら使えばぁ」程度に奨めています。

# .NET 2.0のSystem.Xmlは、XslCompiledTransform以外は単なる飾りの山と設計・実装のバグフィックスです(断言)
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2005-10-15 13:13
私の場合は、読み取り専用なら最初にXmlReaderが使えないかを考えて、使えない場合はXmlDocumentやXPathDocumentでって感じかな。

SelectNodes="NodeName", SelectNodes("NodeName[@attribute='value']")で済むならXmlReaderで済ませてます。
で、特に.NET2.0ではXmlReaderは使いやすくなってるんでお勧めです。
でも子要素をキーにして親を参照する場合は後戻りできないXmlReaderにはもちろん無理ですね。

maruさんがどのようなXMLに対してどのような検索が必要なのかによって変わってくるでしょうが、参考になれば幸いです。

XmlDBに関しては詳しくないのですが、フリーで.NETに対応しているものがあれば、私も使ってみたいですね。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2005-10-17 10:26
いつもお世話になってます。

季節の変わり目でカゼで寝込んでまして返答するのが遅れました。
皆さん返答ありがとうございます。

皆さんの意見を元に検証してみます。


[ メッセージ編集済み 編集者: maru 編集日時 2005-10-17 10:26 ]

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