2011-11-30 49 views
10

我想保存从数据库中读取记录在一个XML文件,
从XML文件记录 拍X号到自定义集合List<T>
对它们进行处理并保存更新的项目转化成XML格式文件。C# - 保存列表<T>到XML文件

“T”是值类型的属性,像一个简单的对象 -

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

请指导我如何自定义集合List<T>保存为XML文件,反之亦然?

而且,因为我没有发出这个XML文件,将是有意义的去XmlSerializer的在某些答复的建议?

谢谢!

+0

它取决于'T' - 有一些示例代码? – BrokenGlass

+0

编辑的问题 – iniki

回答

11

虽然你可以使用一个串行的麻烦 - 很多时候,这是正确的答案 - 我个人会使用LINQ到XML这将让你成为一个如何将XML更加灵活应该看起来像,即创造th E从基于你的类集合foos以下XML:

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

你可以使用:

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两种方法:

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

使用下面的代码(T级从您的代码段两者),你就可以连载到轻松的XML文件,没有implimenting 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服务器不喜欢如下

@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

您可以节省您的List<T>写入一个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)使用了一个非常混乱(与问题无关)的类'person',特别是你没有解释代码是什么以任何方式做。最好提供一些通用的解释,而不仅仅是粘贴代码。 –