2016-03-23 22 views
0

"Student"のプロパティとして "name"という名前の "Student"クラスがネストされた "School"クラスがあります。C#で汎用リストオブジェクトにXMLを読み込む方法は?

public class school 
{ 
    private List<student> mystudents; 

    public class student 
    { 
     private string name; 
    } 
} 

学校には多くの学生がいて、各学生には名前があります。

私は、XML文書を持っている:

<school> 
    <student> 
     <name>John</name> 
    </student> 
    <student> 
     <name>Jane</name> 
    </student> 
    <student> 
     <name>Jack</name> 
    </student> 
</school> 

は、私は学校のオブジェクトを作成し、学校・オブジェクトにこのXMLを読みたい、私はそれをどのように行うのですか、と言うことができますか? XMLをオブジェクトに読み込み、すべてのプロパティに値を再帰的にコピーする作業コードを記述しました。私はserializersを使用するのでは思いました

/*---------------------------------------------------------------- 
    ' Template to read XML document into a Objects 
    '-----------------------------------------------------------------*/ 
    public static T XmlToObject<T>(string fileName, T obj) 
    { 

     // read XML 
     string xmlString = File.ReadAllText(fileName); 
     XmlDocument xmlDocument = new XmlDocument(); 
     xmlDocument.LoadXml(xmlString); 

     // read the root node 
     XmlNode groupsListNode = xmlDocument.GetElementsByTagName(obj.GetType().Name).Item(0); 

     // iterate through and copy values 
     XmlNodeToListProperties(groupsListNode, obj); 

     return obj; 
    } 

public static void XmlNodeToProperties(XmlNode listNode, object obj) 
    { 
     //iterate through properties of object and copy from listNode 
     foreach(var prop in obj.GetType().GetProperties()) 
     { 
      if (listNode[prop.Name] != null) 
      { 
       if (listNode[prop.Name].ChildNodes.Count > 1) // has child-properties 
       { 
        // call recursively 
        XmlNodeToProperties(listNode[prop.Name], prop.GetValue(obj, null)); 
       } 
       else // no child properties 
       { 
        // get proprty type 
        Type t = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType; 

        // convert listNode.FirstChild.value to PropertyType 
        object safeValue = CustomConvert(listNode[prop.Name], t) ; 
        // store in object 
        prop.SetValue(obj, safeValue, null); 
       } 
      } 

が、問題:私は以下

が再帰的に、汎用オブジェクトにXMLを読み取るための私のコードで私はList<T>すなわち、一般的なリストについては、この作品を作るのですか方法がわかりませんそれぞれのプロパティにはxmlElement("name")が必要ですか?私のオブジェクト/クラスのいくつかはサードパーティのAPIから来ているので、 `xmlElement(" name ")を挿入するためにクラスファイルを編集するアクセス権がありません。ジェネリックリストに対応するために、上記の汎用テンプレートを変更/変更するための提案はありますか?

答えて

1

なぜGetElementsByTagNameを使用していますか?あなたはこれが実際に与えられたタイプのすべての子孫を取得することを知っていますか?

完全なオブジェクトツリーを「デシリアライズ」したい場合は、ルートから開始し、その中で作業を進める必要があります。新しいインスタンスをリスト/コレクション/配列に追加するか、objインスタンスでnullのオブジェクトプロパティを追加する必要があります。

あなたはサードパーティのオブジェクトについていえます。そのことが一般的には一般的に困難になります。 APIに応じて、いくつかのファクトリ、親のメソッド、またはコンストラクタを呼び出す必要があります。それがコンストラクタの場合、所有者/親などの引数が必要な場合はどうしますか?

一般的に動作させるには、厳格な規約や定義が必要です。

+0

各xmlファイルは、特定のカスタムオブジェクトタイプにロードする必要のあるデータで構成されています。したがって、私は 'GetElementsByTagName'を使用しています。私はそのカスタムオブジェクト型のすべてを読み込み可能にしたいからです。私は第三者APIからクラスのコンストラクタを呼び出すことができます。 – user2979010

関連する問題