- PR -

Xmlの膨大なテキストを読むには?

1
投稿者投稿内容
かずひろかず
常連さん
会議室デビュー日: 2008/07/01
投稿数: 24
投稿日時: 2008-12-13 13:59
開発 : Windows Vista(x86), Visual Studio 2008 SP1
言語 : VB.NET

こんにちは。

XmlTextReaderを使ってXMLを読み込むアプリケージョンを作っています。
そのアプリケーションで読み込むXMLには膨大なテキストデータがあるのですが、そのデータをメモリにキャッシュせずにファイルに書き出せるものを作ろうと思っています。

そのためにはXmlReaderで読み込まずにIO.FileStreamでも使って「読んでは書き」、とでもしようと思っています。

ですが、XmlTextReaderには現在のストリームの位置を取得できるプロパティがありません。

やはり、位置を取得するのは不可能なのでしょうか。
やり方があれば教えてもらえると幸いです。

=========================================
----------------------------------------------------
Module1.vb
----------------------------------------------------
Private Sub ReadXml(fileName As String)
  Dim reader As New Xml.TextReader(fileName)
  While reader.Read()
    If reader.IsStartElement() Then
      If reader.Name = "sample" Then

        'ここに実装したい
        'LinePositionやLineNumberでは行番号や位置しかわからない。

      End If
    End If
  End While
  reader.Close()
End Sub
----------------------------------------------------
読み込まれるXmlファイル
----------------------------------------------------
<xml>
 <data>
  <sample>ここに膨大なテキストデータが入ります。</sample>
  <sample>...sample
 </data>
</xml>
=========================================
どなたか、よろしくお願いします。
なかむら
ベテラン
会議室デビュー日: 2008/11/11
投稿数: 67
お住まい・勤務地: 福岡
投稿日時: 2008-12-13 21:52
XmlTextReader は Stream を受け取るコンストラクタがあります。
コンストラクタに渡す Stream を別の変数に保持しておき、
それを使って Stream にアクセスできるのでは?

上の方法は全く試していませんが。

_________________
Nakamura Blog

[ メッセージ編集済み 編集者: なかむら 編集日時 2008-12-13 21:56 ]
かずひろかず
常連さん
会議室デビュー日: 2008/07/01
投稿数: 24
投稿日時: 2008-12-13 22:13
なかむらさん、返信ありがとうございます。

Dim s As New IO.FileStream(fileName, IO.FileMode.Open)
Dim reader As New XmlTextReader(s)

...(省略)

If reader.Name = "sample" Then
 'ここに実装したい
 'LinePositionやLineNumberでは行番号や位置しかわからない。

 MsgBox(s.Position + "," + s.Length)

End If

...(省略)

試してみたのですが、Streamが返してくるPositionは、ファイルの長さ(Length)と同じでした。
どうやらStreamは最後まで読まれているようです。
どうすれば取得できるのでしょうか?
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-12-14 02:52
XML全体を読み込むのは嫌で、sample要素を1個ずつ読んで何かに書き込もうということでしょうか?

「'ここに実装したい 」の部分で、
reader.ReadInnerXml()でsample要素の中身が取れますがこれではだめですか?
かずひろかず
常連さん
会議室デビュー日: 2008/07/01
投稿数: 24
投稿日時: 2008-12-14 11:08
べるさん、返信ありがとうございます。

sample要素の中にはバイナリを独自にテキスト変換したものを入れる予定なので、メモリにキャッシュしない方法を探しています。
それを何文字か読み込んでは変換してファイルに保存、という風にしたいのです。
そこでStreamを使いたいのですが・・・

どうかよろしくお願いします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2008-12-15 11:04
XMLも扱える DBの機能を使って sample要素に値を注入したほうが良いのでは。
---
XHTMLブラウザへマルチパート・メッセージを送る方法
とかの 話かな?

[ メッセージ編集済み 編集者: MMX 編集日時 2008-12-15 15:05 ]
1

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