保存列表<;T>;到XML文件

本文关键字:XML 文件 gt lt 保存 列表 | 更新日期: 2023-09-27 18:16:21

我想将从数据库提取的记录保存在XML文件中,
将XML文件中的x条记录放入自定义集合List<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是否有意义?

保存列表<;T>;到XML文件

以下是我们使用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();
    }
 }

虽然你可以使用序列化程序-很多时候这是正确的答案-但我个人会使用Linq-to-XML,这将使你在XML的外观上更加灵活,即根据你的类从集合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))));

使用下面的代码(从代码片段中提取的T类(,您将能够轻松地序列化到XML文件中,而无需实现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();

使用XmlSerializer类。向下滚动大约三分之一的方式查看示例。

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

您可以将List<T>保存到DataTable中,然后写入Xml

    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");