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

时间:2010-10-06 08:56:23

标签: c# xml xml-serialization

我定义了3个类:

public class PublishedPage
{
    public string Action { get; private set; }
    public string PageGuid { get; set; }
    public List<string> SearchableProperties { get; set; }

    public PublishedPage()
    {
        Action = "Published";
        SearchableProperties = new List<string>();
    }
}

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<PublishedPage> publishedPages = GetPublishedPages();
List<MovedPage> movedPages = GetMovedPages();
List<DeletedPage> deletedPages = GetDeletedPages();

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

<PublishedPages>
   <PublishedPage>
      <Action>Published</Action>
      <PageGuid>.....</PageGuid>
      <SearchableProperties>
         <Name>Name 1</Name>
         <Name>Name 2</Name>
      </SearchablePeoperties>
   </PublishedPage>
   <PublishedPage>
   ...
   <PublishedPage>
</PublishedPages>
<MovedPages>
...
</MovedPages>
<DeletedPages>
...
</DeletedPages>

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

6 个答案:

答案 0 :(得分:8)

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

即使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)))
                      )
         )
     );

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

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

private List<XmlElement> functionA ()
{
    XmlDocument doc = new XmlDocument();
    List<XmlElement> elementList = new List<XmlElement>();
    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 

答案 5 :(得分:0)

试试这个,我正在使用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<string>()
                    {
                        "Foo",
                        "Bar",
                    }
                });
            pages.PublishedPages.Add(
                new PublishedPage()
                {
                    PageGuid = Guid.NewGuid().ToString(),
                    SearchableProperties = new List<string>()
                    {
                    "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));
        }

        /// <summary>
        /// To convert a Byte Array of Unicode values (UTF-8 encoded) to a complete String.
        /// </summary>
        /// <param name="characters">Unicode Byte Array to be converted to String</param>
        /// <returns>String converted from Unicode Byte Array</returns>
        private static string UTF8ByteArrayToString(Byte[] characters)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            string constructedString = encoding.GetString(characters);
            return (constructedString);
        }

        /// <summary>
        /// Converts the String to UTF8 Byte array and is used in De serialization
        /// </summary>
        /// <param name="pXmlString"></param>
        /// <returns></returns>
        private static Byte[] StringToUTF8ByteArray(string pXmlString)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            Byte[] byteArray = encoding.GetBytes(pXmlString);
            return byteArray;
        }

        /// <summary>
        /// From http://www.dotnetjohn.com/articles.aspx?articleid=173
        /// Method to convert a custom Object to XML string
        /// </summary>
        /// <param name="pObject">Object that is to be serialized to XML</param>
        /// <returns>XML string</returns>
        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<PublishedPage> PublishedPages { get; set; }
        public List<MovedPage> MovedPages { get; set; }
        public List<DeletedPage> DeletedPages { get; set; }

        public Pages()
        {
            PublishedPages = new List<PublishedPage>();
            MovedPages = new List<MovedPage>();
            DeletedPages = new List<DeletedPage>();
        }
    }

    public class PublishedPage
    {
        public string Action { get; set; }
        public string PageGuid { get; set; }
        public List<string> SearchableProperties { get; set; }

        public PublishedPage()
        {
            Action = "Published";
            SearchableProperties = new List<string>();
        }
    }

    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";
        }
    }
}
相关问题