- PR -

C# 巨大なXMLファイルの一部を修正する方法

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 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#言語

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-07-30 14:31
引用:

手始めにXmlTextReader()/XmlTextWriter()で読み書きしています。
XMLファイルが巨大になると全てを読み込み全てを書き直すのは効率が悪いです。
より適切な方法をアドバイス願います。



DOM の使用が厳しいなら、XmlTextReader() で読み込みつつ XmlTextWriter() で書き出す他に方法はありません。

それで望む性能や機能が実現できないなら、「ストア」として XML を使用すること自体を見直すべきです。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-07-30 18:42
ADO.NETを使う手もあるような気がします。
検索用にユニークキーが必要にはなりますが...(1件ずつ確認する場合は不要)

_________________
IEEE-CSDP 2004-2007

[ メッセージ編集済み 編集者: iStation 編集日時 2005-07-30 19:07 ]
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-07-30 18:57
SAXで処理するのがよいかと。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-07-30 23:01
ご回答ありがとうございます。

XmlTextReaderとXmlTextWriterで実現できればと思っています
下記(1)(2)についてアドバイスいただければありがたいです。

質問
(1)XmlTextReaderで該当位置まで読み進んだ位置をXmlTextWriterに引き渡す方法

(2)(1)ができると仮定して、更に(a)(b)の方法が分かればあらゆる修正ができるはずです。
(a)該当位置に新しい要素を挿入する。
(b)該当位置の次の要素を削除する。

(3)(1)で該当位置をXmlTextWriterに取得した後に、WriteElementString()を実行してもきちんと挿入してくれるのでしょうか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-07-30 23:08
XMLは結局の所テキストファイルです。
テキストファイルに対して途中で文字を挿入したり削除したりという処理はできません。
あくまで元ファイルから読み取り/別ファイルに書き込みという処理を行うだけです。
もりた
会議室デビュー日: 2005/07/31
投稿数: 1
投稿日時: 2005-07-31 03:43
引用:

XmlTextReaderとXmlTextWriterで実現できればと思っています



一度XMLのフォーマットを見直ししたほうがいいと思いますよ。
Elementの移動が頻発しそうです。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2005-07-31 13:58
SAXは私は未経験ですが試してみる価値はあるかも
http://www.atmarkit.co.jp/fxml/rensai/xdk03/xdk03.html

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