C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: XML出力について


(過去ログ 67 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■38758 / inTopicNo.1)  XML出力について
  
□投稿者/ める (5回)-(2009/07/24(Fri) 16:34:49)

分類:[C#] 

いつもお世話になります。
下記のようなクラスがあります。

public sealed class SampleClass
{
    private int codeNo;
    private string codeName;
    private List<string> subName = new List<string>();
}

で、このクラスのインスタンス1つ1つに名前をつけて、

Dictionary<string, SampleClass> dicSample

と、いう形で保持しています。

最終的にこのデータをSQLServerのXML型のフィールドに
格納したいと考えているのですが、XMLの操作は初めてなもので、
まずは手始めにファイルに出力してみようと思っています。

System.Xml.Serialization.XmlSerializer serializer
    = new System.Xml.Serialization.XmlSerializer
      (typeof(Dictionary<string, SampleClass>));

単一クラスのXML出力のサンプルの見様、見真似で
こんなコード書きましたがエラーとなりました。

ここで質問なのですが、そもそもこういった複雑な
型(?)のXML出力って可能なのでしょうか?

また、なんらかの形で出力できたとして、今後SQLServerに
格納する場合は出力先はfilestreamではなく、「何か」の
オブジェクトに出力し、その「何か」をSQLServerのフィールドに
設定するとの認識でOKですか?
OKであれば「何か」とは何でしょうか?
XMLってテキストなのでstringで扱えば良いのでしょうか?

(ちなみにXMLに関しては値をタグで囲ってあるだけ。
の認識でしかありません(^^;)

環境はVS2005/C#/.net2.0です。

宜しくお願い致します。

引用返信 編集キー/
■38779 / inTopicNo.2)  Re[1]: XML出力について
□投稿者/ Jitta on the way (358回)-(2009/07/24(Fri) 21:18:09)
No38758 (める さん) に返信
> いつもお世話になります。
> 下記のようなクラスがあります。
>
> public sealed class SampleClass
> {
> private int codeNo;
> private string codeName;
> private List<string> subName = new List<string>();
> }
>
> で、このクラスのインスタンス1つ1つに名前をつけて、
>
> Dictionary<string, SampleClass> dicSample
>
> と、いう形で保持しています。
>
> 最終的にこのデータをSQLServerのXML型のフィールドに
> 格納したいと考えているのですが、XMLの操作は初めてなもので、
> まずは手始めにファイルに出力してみようと思っています。
>
> System.Xml.Serialization.XmlSerializer serializer
> = new System.Xml.Serialization.XmlSerializer
> (typeof(Dictionary<string, SampleClass>));
>
> 単一クラスのXML出力のサンプルの見様、見真似で
> こんなコード書きましたがエラーとなりました。
>
> ここで質問なのですが、そもそもこういった複雑な
> 型(?)のXML出力って可能なのでしょうか?
>
> 環境はVS2005/C#/.net2.0です。


コードのどこで、なんというエラーが出たのでしょうか?テキトーにまとめず、メッセージをそのまま書いてください。


2005 であれば、

class 辞書 : Dictionary<string, SampleClass>

とすれば、いいかも
引用返信 編集キー/
■38784 / inTopicNo.3)  Re[2]: XML出力について
□投稿者/ やじゅ (1132回)-(2009/07/24(Fri) 22:33:14)
やじゅ さんの Web サイト
> ■No38758 (める さん) に返信

参考にしたサイト
C#::DictionaryをXMLSerializerでシリアライズしたいんですが?
http://d.hatena.ne.jp/lord_hollow/20090206/p1
XML シリアル化について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=30092&forum=7
XmlSerializerではできませんが、BinaryFormatterではシリアライズできます。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=16984&KLOG=34
XmlSerializerを使ってインスタンスをXML形式でシリアライズする
http://handcraft.blogsite.org/ComponentGeek/ShowArticle/60.aspx

■ソースリスト:
    public class SerializableDictionary<Tkey, Tvalue> : Dictionary<Tkey, Tvalue>, IXmlSerializable
    {
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;    //スキーマの定義はめんどくさいので省略
        }

        public void ReadXml(System.Xml.XmlReader reader)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(KeyValue));
            reader.Read();
            while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
            {
                KeyValue kv = serializer.Deserialize(reader) as KeyValue;
                if (kv != null) Add(kv.Key, kv.Value);
            }
            reader.Read();
        }

        public void WriteXml(System.Xml.XmlWriter writer)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(KeyValue));
            foreach (var key in Keys)
            {
                serializer.Serialize(writer, new KeyValue(key, this[key]));
            }
        }

        public class KeyValue
        {
            public KeyValue() { }
            public KeyValue(Tkey key, Tvalue value) { Key = key; Value = value; }
            public Tkey Key { get; set; }
            public Tvalue Value { get; set; }
        }
    }

    public class SampleClass
    {
        public int codeNo;
        public string codeName;
        public List<string> subName = new List<string>();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //保存するSampleClassオブジェクトを作成
        SerializableDictionary<string, SampleClass> dicSample = new SerializableDictionary<string, SampleClass>();
            
        SampleClass myClass = new SampleClass();
        myClass.codeNo = 1;
        myClass.codeName = "Name1";
        myClass.subName = new List<string>() { "A", "B" };
        dicSample.Add("KEY1", myClass);

        myClass = new SampleClass(); 
        myClass.codeNo = 2;
        myClass.codeName = "Name2";
        myClass.subName = new List<string>() { "C", "D" };
        dicSample.Add("KEY2", myClass);
            

        System.Xml.XmlWriterSettings st = new System.Xml.XmlWriterSettings();
        st.Encoding = System.Text.Encoding.UTF8;
        st.Indent = true;
        st.IndentChars = ("\t");    // Intentは不要ならコメントアウトしてね。

        //書き込み
        System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(@"C:\test.xml", st);
        writer.WriteStartElement("Root");
        dicSample.WriteXml(writer);
        writer.WriteEndElement();
        writer.Close();

        //読み取り
        dicSample.Clear();
        System.Xml.XmlReader reader = System.Xml.XmlReader.Create(@"C:\test.xml");
        reader.ReadStartElement("Root");
        dicSample.ReadXml(reader);
        reader.Close();
    } 

■Text.xmlの内容
<Root>
	<KeyValueOfStringSampleClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
		<Key>KEY1</Key>
		<Value>
			<codeNo>1</codeNo>
			<codeName>Name1</codeName>
			<subName>
				<string>A</string>
				<string>B</string>
			</subName>
		</Value>
	</KeyValueOfStringSampleClass>
	<KeyValueOfStringSampleClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
		<Key>KEY2</Key>
		<Value>
			<codeNo>2</codeNo>
			<codeName>Name2</codeName>
			<subName>
				<string>C</string>
				<string>D</string>
			</subName>
		</Value>
	</KeyValueOfStringSampleClass>
</Root>

引用返信 編集キー/
■38785 / inTopicNo.4)  Re[1]: XML出力について
□投稿者/ やじゅ (1133回)-(2009/07/24(Fri) 22:54:31)
やじゅ さんの Web サイト
2009/07/24(Fri) 22:58:25 編集(投稿者)

No38758 (める さん) に返信
> また、なんらかの形で出力できたとして、今後SQLServerに
> 格納する場合は出力先はfilestreamではなく、「何か」の
> オブジェクトに出力し、その「何か」をSQLServerのフィールドに
> 設定するとの認識でOKですか?
> OKであれば「何か」とは何でしょうか?
> XMLってテキストなのでstringで扱えば良いのでしょうか?
>

一般的なXML形式であれば、文字列型(varchar)かXML型で扱えばいいですね。
BinaryFormatterで扱った場合は、バイナリ形式となるので、バイト配列(Byte[])となるかな
http://www.atmarkit.co.jp/fdotnet/easyxml/easyxml13/easyxml13_03.html

おまけ:業務データを 1 テーブル 1 カラムに集約しちゃおう!
http://www.microsoft.com/japan/powerpro/community/te08program/default.mspx
引用返信 編集キー/
■38868 / inTopicNo.5)  Re[2]: XML出力について
□投稿者/ める (6回)-(2009/07/27(Mon) 09:53:09)
お返事遅くなりました。
Jitta on the wayさん、やじゅさん
レスありがとうございます。

>コードのどこで、なんというエラーが出たのでしょうか?テキトーにまとめず、
>メッセージをそのまま書いてください。
すみません、サンプルソースをそのままDictionary<>に変えて駄目
だったので、普通には無理との思い込みで内容だけ書いてしまいました。
気をつけます。

やじゅさんのサンプルコードを参考に
これから作業してみようと思います。
参考になるリンク先も提示して頂けましたので、
ちょっと頑張ってみます。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -