2011-11-30 1 views
10

、カスタムコレクションにXMLファイルからのレコードの
テイクx個List<T>
プロセスXMLファイルにそれらを一覧 を保存して、XMLに戻す更新されたアイテムを保存しますファイル。 C#が - 私は、XMLファイルにデータベースからフェッチレコードを保存したい

「T」の値型のプロパティを持つ単純なオブジェクトである、のようなもの -

public class T 
{ 
    public int Id {get; set;} 
    public string property1 {get; set;} 
    public string property2 {get; set;} 
} 

は、私は、XMLファイル、およびその逆にカスタムコレクションList<T>を保存することができますどのように私を導いてください?

また、私はこのXMLファイルを送信していないので、いくつかの回答で示唆されているようにXmlSerializerに行くのは意味がありますか?

ありがとうございました!

+0

これは 'T'に依存しています - いくつかのサンプルコードがありますか? – BrokenGlass

+0

質問が編集されました – iniki

答えて

11

あなたはシリアライザを使用することもできますがimplimentingの手間をかけずにつまり、thを作成するあなたが使用することができ

<Foos> 
    <foo Id="1" property1="someprop1" property2="someprop2" /> 
    <foo Id="1" property1="another" property2="third" /> 
</Foos> 

:あなたのクラスに基づいて収集foosからXMLを次の電子ストアドプロシージャに

var xml = new XElement("Foos", foos.Select(x=> new XElement("foo", 
               new XAttribute("Id", x.Id), 
               new XAttribute("property1", x.property1), 
               new XAttribute("property2", x.property2)))); 
2

XmlSerializerクラスを使用してください。例の1/3のスクロールダウン。

+0

+1シリアライズもここに来ました。 – Jeremy

+0

私はこのXMLファイルを送信していないので、XmlSerializerに行くのは意味がありますか? – iniki

+1

XMLSerializerを使用すると、オブジェクトをXMLに変換できます。それはファイルを "送る"こととは関係がありません。 –

13

は、ここでは、このXmlSerializerを使用して達成するために使用する2つの方法である:以下のコードを使用して

public static T FromXML<T>(string xml) 
{ 
    using (StringReader stringReader = new StringReader(xml)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(T)); 
     return (T)serializer.Deserialize(stringReader); 
    } 
} 

public string ToXML<T>(T obj) 
{ 
    using (StringWriter stringWriter = new StringWriter(new StringBuilder())) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
     xmlSerializer.Serialize(stringWriter, obj); 
     return stringWriter.ToString(); 
    } 
} 
+2

そして、Tのインスタンスには、パラメータのないコンストラクタが必要です。 – zionpi

+1

これは動作していません – motto

5

を使用すると、簡単にXMLファイルにシリアライズすることができるようになります(クラスTは、あなたのコードスニペットから撮影します)これが正しい答えであり、多くの時間 - - 私は個人的にあなたがどのようにXMLのより柔軟にできるようになるXMLへのLINQを使用して、ISerializable

[Serializable()] 
public class T 
{ 
    public int Id {get; set;} 
    public string property1 {get; set;} 
    public string property2 {get; set;} 
} 

... 

List<T> data = new List<T>() 

... // populate the list 

//create the serialiser to create the xml 
XmlSerializer serialiser = new XmlSerializer(typeof(List<T>)); 

// Create the TextWriter for the serialiser to use 
TextWriter filestream = new StreamWriter(@"C:\output.xml"); 

//write to the file 
serialiser.Serialize(filestream , data); 

// Close the file 
fileStream.Close(); 
0
List<BI_QA_ChoiceEntity> choiceSet = new List<BI_QA_ChoiceEntity>(); 
     choiceSet = biEntityObj.ChoiceSet; 

     XmlDocument ChoiceXML = new XmlDocument(); 
     ChoiceXML.AppendChild(ChoiceXML.CreateElement("CHOICESET")); 
     foreach (var item in choiceSet) 
     { 
      XmlElement element = ChoiceXML.CreateElement("CHOICE"); 
      // element.AppendChild(ChoiceXML.CreateElement("CHOICE_ID")).InnerText = Convert.ToString(item.ChoiceID); 
      element.AppendChild(ChoiceXML.CreateElement("CHOICE_TEXT")).InnerText = Convert.ToString(item.ChoiceText); 
      element.AppendChild(ChoiceXML.CreateElement("SEQUENCE")).InnerText = Convert.ToString(item.Sequence); 
      element.AppendChild(ChoiceXML.CreateElement("ISCORRECT")).InnerText = Convert.ToString(item.IsCorrect); 
      ChoiceXML.DocumentElement.AppendChild(element); 
     } 

パスChoiceXMLその後、SQL Serverが

次のように好きですか
@Choice_XML VARCHAR(MAX)=NULL 

IF(@Choice_XML<>'') 
       BEGIN 
        SET @intDocHandle =0 
        --Create an internal representation of the XML document. 
        EXEC sp_xml_preparedocument @intDocHandle OUTPUT, 

@Choice_XML 

       --SET @ChoiceID = (SELECT max([choice_id])+1 AS 'ChoiceID' from BI_QUESTION_CHOICE) 

       --Insert 
       INSERT BI_QUESTION_CHOICE 
       (
        [choice_id], 
        [choice_descr], 
        [sequence], 
        [question_id], 
        [is_correct], 
        [created_by], 
        [created_dt], 
        [modified_by], 
        [modified_dt] 
       ) 
       SELECT (SELECT max([choice_id])+1 AS 'ChoiceID' from BI_QUESTION_CHOICE), 
        CASE WHEN CHOICE_TEXT='' THEN NULL ELSE CHOICE_TEXT END, 
        CASE WHEN SEQUENCE='' THEN NULL ELSE SEQUENCE END, 
        QuestionID, 
        CASE WHEN ISCORRECT='' THEN NULL ELSE ISCORRECT END, 
        'mbathini', 
        GETDATE(), 
        'mbathini', 
        GETDATE() 
       FROM OPENXML(@intDocHandle,'/CHOICESET/CHOICE', 3) 
       WITH 
       (CHOICE_TEXT VARCHAR(500), 
       SEQUENCE VARCHAR(50), 
       QuestionID INT, 
       ISCORRECT bit) 

END 
-1

あなたはを保存できますをDataTableに入れてWriteXmlにする

T t0 = new T(); 
     t0.id=1; 
     t0.property1="John"; 
     t0.property2="Doe"; 
    List<T> Tlist = new List<T>(); 
     Tlist.Add(t0); 

    DataTable dt = new DataTable(); 
     dt.TableName = "People"; 
     dt.Columns.Add("ID"); 
     dt.Columns.Add("Name"); 
     dt.Columns.Add("Lastname"); 


     foreach(var item in tlist) 
     { 
      dt.Rows.Add(); 
      dt.Rows[dt.Rows.Count-1]["ID"] = item.name; 
      dt.Rows[dt.Rows.Count - 1]["Name"] = item.id_cod; 
      dt.Rows[dt.Rows.Count - 1]["Lastname"] = item.id_cod; 


     } 
     dt.WriteXml("test.Xml"); 
+0

これはどのように質問に関係していますか? –

+0

どういう意味ですか? –

+0

あなたの[オリジナルの返答](http://stackoverflow.com/revisions/36350950/1)は、非常に混乱していた(人物に関連していない)クラスの人を使用しました。特に、コードいかなる方法でもあります。コードを貼り付けるのではなく、一般的な説明を提供することが常にベストです。 –

関連する問題