none
XmlSerializerについての質問です。 RRS feed

  • 質問

  • C#の初心者剣道です、宜しくお願いします。

    今、XMLファイルを作成し、PGからデータを読み取りしたいです。
    親項目:<PatientInfo>
    子項目: <tableName>、<Column>
    今、<tableName>の値を取得しましたが、
    配列<Column>の値を取得する時に、例外発生しまして、
    旨くいかなかったです、方法を尋ねています。

     

    ヒント、解決策があるようでしたら教えていただけないでしょうか。
    宜しくお願いいたします。

     

    Program.csコード
    namespace ConsoleApplication3
    {
        public class PatientInfo
        {
            public string tableName;   // 親タグ項目tableName    
        }

     

        public class Column
        {
            public string Name;   // 子タグColumn項目name
            public string Type;    // 子タグColumn項目type
            //public int Size; 
        }

     

        class Program
        {
            static void Main(string[] args)
            {
                Column[] arr = new Column[10];
                for (int i = 0; i < 10; i++)
                {
                    arrIdea         = new Column();
                    arrIdea.Name = i.ToString();
                    arrIdea.Type  = i.ToString();
                }
                System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(PatientInfo));
                System.IO.FileStream fs = new System.IO.FileStream(@"C:\test4.xml", System.IO.FileMode.Open);
                Column[] columns;
               
                PatientInfo info;
                info = (PatientInfo)ser.Deserialize(fs);           // 子項目tableName値

                System.Xml.Serialization.XmlSerializer ser1 = new System.Xml.Serialization.XmlSerializer(typeof(Column[]));
                columns = (Column[])ser.Deserialize(fs);       //  例外発生★??? 

     foreach (column loadcolumn in columns)
                 {
                     // 復元Name,Type取得
                 }
                fs.Close();
            }
        }
    }
    ****************************************
    XMLファイル   test.xml

    <?xml version="1.0"?>
    <PatientInfo>
        <tableName>IBAPATIENT</tableName>
        <Column>
            <Name>PATIENTNO</Name>
            <Type>int</Type>
            <Size>0</Size>  
        </Column>
        <Column>
            <Name>KANJILASTNAME</Name>
            <Type>varchar</Type>
            <Size>20</Size> 
        </Column>
        <Column>
            <Name>KANJIFIRSTNAME</Name>
            <Type>varchar</Type>
            <Size>20</Size> 
        </Column>
        <Column>
            <Name>KANALASTNAME</Name>
            <Type>varchar</Type>
            <Size>20</Size> 
        </Column>
        <Column>
            <Name>KANAFIRSTNAME</Name>
            <Type>varchar</Type>
            <Size>20</Size> 
        </Column>
        <Column>
            <Name>BIRTHDAY</Name>
            <Type>datetime</Type>
            <Size>0</Size> 
        </Column>
        <Column>
            <Name>SEX</Name>
            <Type>varchar</Type>
            <Size>0</Size> 
        </Column>
    </PatientInfo>

     

    2007年11月16日 8:41

回答

  •  

    コード ブロック

    PatientInfo info;
    info = (PatientInfo)ser.Deserialize(fs); 

     

     

     

    これで、全部はいってきますよ。infoに。tablenameもcolumnも。

    2007年11月19日 2:48

すべての返信

  • シリアライズって詳しくないですけど、(いや全部かもw)

    以下の感じで。

     

    コード ブロック

    public class PatientInfo
        {
            public string tableName;   // 親タグ項目tableName  
            [XmlElement]
            public ColumnInfo[] Column;
        }
       
        public class ColumnInfo
        {
            public string Name;   // 子タグColumn項目name
            public string Type;    // 子タグColumn項目type
            public int Size;
        }

     

     

    でもテーブルの構造を読み書きしたいのであれば、

    DataTableのWriteXmlSchema,ReadXmlSchemaを使うといいかも。

    2007年11月16日 13:36
  • はなはなはなさん

    ご返答をいただき、有難う御座います。

    教えていただいた方法で、PGを改修しましたが、

    逆シリアル化の段階で、子項目が配列の場合、どうやって値を取得できるのか、

    また理解出来ていないです。もうちょっと、詳しく教えていただけないでしょうか。。。

    宜しくお願い致します。

     

    コード ブロック

    public class PatientInfo
        {
            public string tableName;   // 親タグ項目tableName  
            [XmlElement]
            public ColumnInfo[] Column;     // public List<Column> columns;
        }
       
        public class ColumnInfo
        {
            public string Name;   // 子タグColumn項目name
            public string Type;    // 子タグColumn項目type
            public int Size;
        }

    class Program
        {
            static void Main(string[] args)
            {
                PatientInfo pat = new PatientInfo();
                System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(PatientInfo));

                 
                System.Xml.Serialization.XmlSerializer ser1 = new System.Xml.Serialization.XmlSerializer(typeof(Column[]));


                System.IO.FileStream fs = new System.IO.FileStream(@"C:\test4.xml", System.IO.FileMode.Open);

                pat.tableName = ((PatientInfo)ser.Deserialize(fs)).ToString();    //配列でなはい項目OKです。

           

          for (int i = 0; i < pat.columns.Count; i++)
                {

                      // 配列の場合、データの取得処理は分からないです。教えていただけないでしょうか。
                }                 
            }
        }

     

     

    2007年11月19日 2:33
  •  

    コード ブロック

    PatientInfo info;
    info = (PatientInfo)ser.Deserialize(fs); 

     

     

     

    これで、全部はいってきますよ。infoに。tablenameもcolumnも。

    2007年11月19日 2:48
  • はなはなはなさんへ

    ご丁寧にご回答下さいまして、本当に有難うございました。

    問題が解決しました。

    私が知識不足でしたので、お手数をお掛けしまして、すみませんでした。

    今度、大変勉強になりまして、ありがとうございました。 ...

    また宜しくお願いいたします。

     

     

    2007年11月19日 3:13