dポイントプレゼントキャンペーン実施中!

C#からXMLの読み取りと書き取りについて困っています。

◆開発言語
 C# (Visual Studio 2008)

◆現在の仕様
 1.指定のXMLを読み込みます
   ⇒ テキストストリームを使ってファイルを読み取り
     XMLシリアライズにてクラスにセットしています。
 2.XMLの内容を書き換えます
   ⇒ 指定タグの内容を書き換えます。
 3.XMLを保存します
   ⇒ XMLデシリアライズを用いて
     XMLの内容がセットされているクラスから
     XMLファイルに出力します。
◆問題点
 ここで、「1.指定のXMLを読み込みます」にて
 XML内にあるDOCTYPEや、style-sheet等の情報が
 ごっそりかけてしまっています。
 そのため、「3.XMLを保存します」では
 DOCTYPEや、style-sheet部分がかけています。

◆解決したい方法
 シリアライズなどを用いているとXMLのノードを一つ一つ
 if文で精査する必要がないので、助かっています。
 既存のままで、DOCTYPEや、style-sheetを読み取ち、出力する
 方法は無いのでしょうか?
 ※上記が不可能であれば、その他の方法でも構いません。

A 回答 (2件)

シリアライズというのは,あくまでオブジェクトをバイト列に変換するための手法です。


XmlSerializerは,バイト列の表現にXMLを使っているだけです。

XMLの読み込みであれば,本来はXmlDocumentやXPathDocument,XDocumentなどを利用すべきです。

さて,どうしてもシリアライズを使うのであれば,書き込み時に上記のクラスと組み合わせて使うことを考えてみてはどうでしょうか。

手順)
1. オブジェクトをMemoryStreamにXMLシリアライズする [MS]
2. 元のXMLをXmlDocumentに読み込む [XD1]
3. [MS]からXmlDocumentに読み込む [XD2]
4. [XD1]から,ルート要素の内容をすべて削除する
5. [XD2]のルート要素の内容をすべて[XD1]のルート要素の内容としてコピーする
6. [XD1]を保存する

つまり,大枠だけ残して,中身を入れ替えてしまうのです。
ただし,ルート要素の属性にマッピングするプロパティが存在した場合,この方法は使えません (その部分だけを自分でコピーすれば別です)。

この回答への補足

ご回答ありがとうございます。
因みにですが、どのようにやるのかサンプルなどを提供
していただくことは可能でしょうか?

3. [MS]からXmlDocumentに読み込む [XD2]
4. [XD1]から,ルート要素の内容をすべて削除する
5. [XD2]のルート要素の内容をすべて[XD1]のルート要素の内容としてコピーする

上記の3点の方法が特にわかりません。

補足日時:2009/03/30 18:48
    • good
    • 0

> 3. [MS]からXmlDocumentに読み込む [XD2]



var xd2 = new XmlDocument(); // [XD2]
xd2.Load(ms); // ms : [MS]
http://msdn.microsoft.com/ja-jp/library/e48zttz7 …

> 4. [XD1]から,ルート要素の内容をすべて削除する
> 5. [XD2]のルート要素の内容をすべて[XD1]のルート要素の内容としてコピーする

xd1.DocumentElement.InenrXml = xd2.DocumentElement.InnerXml;
http://msdn.microsoft.com/ja-jp/library/system.x …
    • good
    • 0
この回答へのお礼

返答が大変遅くなってしまい申し訳ございませんでした。
Yune-Kichi様の方法で試したところ、
正しくXMLを出力することができました。

ありがとうございます。
今後も、何かありましたら宜しくお願いいたします。

お礼日時:2009/04/11 17:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!