保存列表<;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是否有意义?
以下是我们使用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");