如何从对象列表创建xml文件

我定义了3个类:

public class PublishedPage { public string Action { get; private set; } public string PageGuid { get; set; } public List SearchableProperties { get; set; } public PublishedPage() { Action = "Published"; SearchableProperties = new List(); } } public class DeletedPage { public string Action { get; private set; } public string PageGuid { get; set; } public DeletedPage() { Action = "Deleted"; } } public class MovedPage { public string Action { get; private set; } public string PageGuid { get; set; } public string OldParentGuid { get; set; } public string NewParentGuid { get; set; } public MovedPage() { Action = "Moved"; } } 

代码中的某处我有这样的东西:

 List publishedPages = GetPublishedPages(); List movedPages = GetMovedPages(); List deletedPages = GetDeletedPages(); 

现在我想创建一个包含这3个集合但不知道如何的XML文件。
XML应该是这样的:

   Published .....  Name 1 Name 2    ...    ...   ...  

任何帮助,将不胜感激。
谢谢!

即使XmlSerializer是最简单的,如果你已经知道了模式,你也可以使用一些linq到xml:

 XElement element = new XElement("PublishedPages", (from page in publishedPages select new XElement("PublishedPage", new XElement("Action", page.Action), new XElement("PageGuid",page.PageGuid), new XElement("SearchableProperties", (from property in page.SearchableProperties select new XElement("Name",property))) ) ) ); 

序列化相当慢。 表现方式。 类似的方法是这样的:

 StringWriter stringWriter = new StringWriter(); XmlTextWriter xmltextWriter = new XmlTextWriter(stringWriter) {Formatting = Formatting.Indented}; // Start document xmltextWriter.WriteStartDocument(); xmltextWriter.WriteStartElement("ROOT"); foreach (PublishedPage page in publishedPages) { //Create a page element xmltextWriter.WriteStartElement("Page"); xmltextWriter.WriteAttributeString("Action", page.Action); xmltextWriter.WriteAttributeString("SearchableProperties", page.SearchableProperties); xmltextWriter.WriteEndElement(); } // Same for the other lists // End document xmltextWriter.WriteEndElement(); xmltextWriter.Flush(); xmltextWriter.Close(); stringWriter.Flush(); 

使用序列化,一个很好的例子在这里: http : //support.microsoft.com/kb/815813

您需要的是@Kyndings指示的XML序列化 。 但我会给你一些代码片段来帮助你:

为了序列化一个对象,您的代码应该类似于

 string serializedPublishedPage = Serializer.SerializeObject(PublishedPage, typeof(PublishedPage)); 

要使所有三个都在同一个XML中,您可以创建一个生成XMLElements列表的函数:

 private List functionA () { XmlDocument doc = new XmlDocument(); List elementList = new List(); XmlElement element; string serializedPublishedPage = Serializer.SerializeObject(PublishedPage, typeof(PublishedPage)); string serializedDeletedPage = Serializer.SerializeObject(DeletedPage, typeof(DeletedPage)); string serializedMovedPage = Serializer.SerializeObject(MovedPage, typeof(MovedPage)); doc.LoadXml(serializedDemographic); element = doc.DocumentElement; elementList.Add(element); return elementList; } 

后来用它:

 XmlDocument xmlData = new XmlDocument(); XmlElement root = xmlData.CreateElement("WHATEVER"); XmlElement Element; XmlNode Node; XmlElement AuxElement; XmlNode AuxNode; foreach (XmlElement xmlElement in functionA()) { AuxNode= doc.ImportNode(xmlElement, true); AuxElement.AppendChild(node); } // Now you have your XML objects in AuxElement Node = xmlData.ImportNode(AuxElement, true); root.AppendChild(Node); // you have your full XML in xmlData in xmlData.InnerXml 

试试这个,我正在使用Xml序列化:

 using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Test { class Program { static void Main(string[] args) { Pages pages = new Pages(); pages.PublishedPages.Add( new PublishedPage() { PageGuid = Guid.NewGuid().ToString(), SearchableProperties = new List() { "Foo", "Bar", } }); pages.PublishedPages.Add( new PublishedPage() { PageGuid = Guid.NewGuid().ToString(), SearchableProperties = new List() { "Tic", "Tac", "Toe", } }); pages.DeletedPages.Add( new DeletedPage() { PageGuid = Guid.NewGuid().ToString(), }); pages.DeletedPages.Add( new DeletedPage() { PageGuid = Guid.NewGuid().ToString(), }); pages.MovedPages.Add( new MovedPage() { PageGuid = Guid.NewGuid().ToString(), OldParentGuid = Guid.NewGuid().ToString(), NewParentGuid = Guid.NewGuid().ToString(), }); pages.MovedPages.Add( new MovedPage() { PageGuid = Guid.NewGuid().ToString(), OldParentGuid = Guid.NewGuid().ToString(), NewParentGuid = Guid.NewGuid().ToString(), }); Console.WriteLine(SerializeObject(pages)); } ///  /// To convert a Byte Array of Unicode values (UTF-8 encoded) to a complete String. ///  /// Unicode Byte Array to be converted to String /// String converted from Unicode Byte Array private static string UTF8ByteArrayToString(Byte[] characters) { UTF8Encoding encoding = new UTF8Encoding(); string constructedString = encoding.GetString(characters); return (constructedString); } ///  /// Converts the String to UTF8 Byte array and is used in De serialization ///  ///  ///  private static Byte[] StringToUTF8ByteArray(string pXmlString) { UTF8Encoding encoding = new UTF8Encoding(); Byte[] byteArray = encoding.GetBytes(pXmlString); return byteArray; } ///  /// From http://www.dotnetjohn.com/articles.aspx?articleid=173 /// Method to convert a custom Object to XML string ///  /// Object that is to be serialized to XML /// XML string public static string SerializeObject(Object pObject) { try { string xmlizedString = null; MemoryStream memoryStream = new MemoryStream(); XmlSerializer xs = new XmlSerializer(pObject.GetType()); XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); xmlTextWriter.Formatting = Formatting.Indented; XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); xs.Serialize(xmlTextWriter, pObject, ns); memoryStream = (MemoryStream)xmlTextWriter.BaseStream; xmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); return xmlizedString; } catch (Exception e) { System.Console.WriteLine(e); return null; } } } [XmlRoot(ElementName="Pages", Namespace="")] public class Pages { public List PublishedPages { get; set; } public List MovedPages { get; set; } public List DeletedPages { get; set; } public Pages() { PublishedPages = new List(); MovedPages = new List(); DeletedPages = new List(); } } public class PublishedPage { public string Action { get; set; } public string PageGuid { get; set; } public List SearchableProperties { get; set; } public PublishedPage() { Action = "Published"; SearchableProperties = new List(); } } public class DeletedPage { public string Action { get; set; } public string PageGuid { get; set; } public DeletedPage() { Action = "Deleted"; } } public class MovedPage { public string Action { get; set; } public string PageGuid { get; set; } public string OldParentGuid { get; set; } public string NewParentGuid { get; set; } public MovedPage() { Action = "Moved"; } } }