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

C# 如何从对象列表创建xml文件,c#,xml,xml-serialization,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 = "Publish

我定义了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";
    }
}
公共类发布页面
{
公共字符串操作{get;private set;}
公共字符串PageGuid{get;set;}
公共列表SearchableProperties{get;set;}
公共发布页面()
{
Action=“Published”;
SearchableProperties=新列表();
}
}
公共类删除页
{
公共字符串操作{get;private set;}
公共字符串PageGuid{get;set;}
公共删除页面()
{
Action=“已删除”;
}
}
公共类移动页面
{
公共字符串操作{get;private set;}
公共字符串PageGuid{get;set;}
公共字符串OldParentGuid{get;set;}
公共字符串NewParentGuid{get;set;}
公共移动页面()
{
Action=“Moved”;
}
}
在代码的某个地方,我有这样的东西:

List<PublishedPage> publishedPages = GetPublishedPages();
List<MovedPage> movedPages = GetMovedPages();
List<DeletedPage> deletedPages = GetDeletedPages();
<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>
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();
List publishedPages=GetPublishedPages();
List movedPages=GetMovedPages();
List deletedpage=getdeletedpage();
现在我想创建一个包含这3个集合的XML文件,但不知道如何创建
XML应该是这样的:

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

出版
.....
名字1
名称2
...
...
...
任何帮助都将不胜感激。

谢谢大家!

使用序列化,这里有一个很好的例子:

序列化相当慢。性能方面。类似的方法如下:

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

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

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

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;
}

试试这个,我正在使用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";
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
名称空间测试
{
班级计划
{
静态void Main(字符串[]参数)
{
页面=新页面();
pages.PublishedPages.Add(
新发布的页面()
{
PageGuid=Guid.NewGuid().ToString(),
SearchableProperties=新列表()
{
“福”,
“酒吧”,
}
});
pages.PublishedPages.Add(
新发布的页面()
{
PageGuid=Guid.NewGuid().ToString(),
SearchableProperties=新列表()
{
“议会”,
“交咨会”,
“脚趾”,
}
});
pages.DeletedPages.Add(
新的DeletedPage()
{
PageGuid=Guid.NewGuid().ToString(),
});
pages.DeletedPages.Add(
新的DeletedPage()
{
PageGuid=Guid.NewGuid().ToString(),
});
pages.MovedPages.Add(
新移动页面()
{
PageGuid=Guid.NewGuid().ToString(),
OldParentGuid=Guid.NewGuid().ToString(),
NewParentGuid=Guid.NewGuid().ToString(),
});
pages.MovedPages.Add(
新移动页面()
{
PageGuid=Guid.NewGuid().ToString(),
OldParentGuid=Guid.NewGuid().ToString(),
NewParentGuid=Guid.NewGuid().ToString(),
});
Console.WriteLine(序列化对象(页面));
}
/// 
///将Unicode值(UTF-8编码)的字节数组转换为完整字符串。
/// 
///要转换为字符串的Unicode字节数组
///从Unicode字节数组转换的字符串
专用静态字符串UTF8ByteArrayToString(字节[]个字符)
{
UTF8Encoding=新的UTF8Encoding();
string constructedString=encoding.GetString(字符);
返回(构造字符串);
}
/// 
///将字符串转换为UTF8字节数组,并用于反序列化
/// 
/// 
/// 
专用静态字节[]StringToUTF8ByteArray(字符串pXmlString)
{
UTF8Encoding=新的UTF8Encoding();
Byte[]byteArray=encoding.GetBytes(pXmlString);
乘火车返回;
}
/// 
///从http://www.dotnetjohn.com/articles.aspx?articleid=173
///方法将自定义对象转换为XML字符串
/// 
///要序列化为XML的对象
///XML字符串
公共静态字符串序列化对象(对象POObject)
{
尝试
{
字符串xmlizedString=null;
MemoryStream MemoryStream=新的MemoryStream();
XmlSerializer xs=新的XmlSerializer(pObject.GetType());
XmlTextWriter XmlTextWriter=新的XmlTextWriter(memoryStream,Encoding.UTF8);
xmlTextWriter.Formatting=Formatting.Indented;
XmlSerializerNamespaces ns=新的XmlSerializerNamespaces();
加上(“,”);
序列化(xmlTextWriter、POObject、ns);
memoryStream=(memoryStream)xmlTextWriter.BaseStream;
xmlizedString=UTF8ByteArrayToString(memoryStream.ToArray());
返回xmlizedString;
}
捕获(例外e)
{
系统控制台写入线(e);
返回null;
}
}
}
[XmlRoot(ElementName=“Pages”,Namespace=”“)]
公共类页面
{
公共列表发布页面{get;set;}
公共列表移动页面{get;set;}
公开名单