- - PR -
C# 巨大なXMLファイルの一部を修正する方法
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-07-30 14:02
既存の(巨大な)XMLファイルの一部を修正する適切な方法を知りたい。
例えば、例題1、例題2のような操作をしたい。 例題では小さい名簿(たった5、6名分)ですが、実際は巨大な名簿(5000人分) で、少メモリーも加味しなければならないと想定します。 課題1 5名分データを含んだ名簿を作成したところ、1名分抜けていたことに気がつきました。 "鈴木花子"さんの名簿の後ろに(氏名="宇野健一",社員番号="003")を挿入し、"総数"を 6名に更新したい。 課題2 "内藤一郎"さんが退職したので、名簿から削除し、総数を更新したい。 <想定しているXML> <?xml version="1.0" encoding="utf-8" standalone="no"?> <名簿> <!--総数:後から氏名を追加(削除)する場合は更新する--> <総数>5</総数> <!--氏名と社員番号--> <氏名>井上太郎</氏名> <社員番号>001</社員番号> <氏名>鈴木花子</氏名> <社員番号>002</社員番号> <氏名>田原弘</氏名> <社員番号>004</社員番号> <氏名>内藤一郎</氏名> <社員番号>005</社員番号> <氏名>浜田久美子</氏名> <社員番号>006</社員番号> </名簿> <ソースコード> string[] name = new string[]{"井上太郎","鈴木花子","田原弘","内藤一郎","浜田久美子"}; string[] id = new string[]{"001","002","004","005","006"}; XmlTextWriter xw = new XmlTextWriter(@"c:\data\test1.xml",Encoding.UTF8); xw.Formatting = Formatting.Indented; xw.WriteStartDocument(false); xw.WriteStartElement("名簿"); xw.WriteComment("総数:後から氏名を追加(削除)する場合は更新する"); xw.WriteElementString("総数",name.Length.ToString()); xw.WriteComment("氏名と社員番号"); for(int i = 0;i < name.Length;i++) { xw.WriteElementString("氏名",name[i]); xw.WriteElementString("社員番号",id[i]); } xw.WriteEndElement(); xw.WriteEndDocument(); xw.Close(); XMLの初心者です。 手始めにXmlTextReader()/XmlTextWriter()で読み書きしています。 XMLファイルが巨大になると全てを読み込み全てを書き直すのは効率が悪いです。 より適切な方法をアドバイス願います。 環境 VisualStudio2003 + C#言語 | ||||
|
投稿日時: 2005-07-30 14:31
DOM の使用が厳しいなら、XmlTextReader() で読み込みつつ XmlTextWriter() で書き出す他に方法はありません。 それで望む性能や機能が実現できないなら、「ストア」として XML を使用すること自体を見直すべきです。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||
|
投稿日時: 2005-07-30 18:42
ADO.NETを使う手もあるような気がします。
検索用にユニークキーが必要にはなりますが...(1件ずつ確認する場合は不要) _________________ IEEE-CSDP 2004-2007 [ メッセージ編集済み 編集者: iStation 編集日時 2005-07-30 19:07 ] | ||||
|
投稿日時: 2005-07-30 18:57
SAXで処理するのがよいかと。
| ||||
|
投稿日時: 2005-07-30 23:01
ご回答ありがとうございます。
XmlTextReaderとXmlTextWriterで実現できればと思っています 下記(1)(2)についてアドバイスいただければありがたいです。 質問 (1)XmlTextReaderで該当位置まで読み進んだ位置をXmlTextWriterに引き渡す方法 (2)(1)ができると仮定して、更に(a)(b)の方法が分かればあらゆる修正ができるはずです。 (a)該当位置に新しい要素を挿入する。 (b)該当位置の次の要素を削除する。 (3)(1)で該当位置をXmlTextWriterに取得した後に、WriteElementString()を実行してもきちんと挿入してくれるのでしょうか? | ||||
|
投稿日時: 2005-07-30 23:08
XMLは結局の所テキストファイルです。
テキストファイルに対して途中で文字を挿入したり削除したりという処理はできません。 あくまで元ファイルから読み取り/別ファイルに書き込みという処理を行うだけです。 | ||||
|
投稿日時: 2005-07-31 03:43
一度XMLのフォーマットを見直ししたほうがいいと思いますよ。 Elementの移動が頻発しそうです。 | ||||
|
投稿日時: 2005-07-31 13:58
SAXは私は未経験ですが試してみる価値はあるかも
http://www.atmarkit.co.jp/fxml/rensai/xdk03/xdk03.html |