トップ回答者
XmlSerializerについての質問です。

質問
-
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++)
{
arr= new Column();
arr.Name = i.ToString();
arr.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>
回答
すべての返信
-
シリアライズって詳しくないですけど、(いや全部かも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を使うといいかも。
-
はなはなはなさん
ご返答をいただき、有難う御座います。
教えていただいた方法で、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++)
{// 配列の場合、データの取得処理は分からないです。教えていただけないでしょうか。
}
}
}