代码之家  ›  专栏  ›  技术社区  ›  Å¡ljaker

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

  •  3
  • Å¡ljaker  · 技术社区  · 15 年前

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


    <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 回复  |  直到 13 年前
        2
  •  4
  •   jmservera    15 年前

    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
  •  4
  •   Dave    13 年前

    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();
    
        5
  •  0
  •   Oscar Foley    15 年前

    你需要的是 串行化 如@Kindings所示。但是我会给你一些 代码片段 帮助:

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

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

    要将这三个元素都包含在同一个XML中,您可以创建一个生成XML元素列表的函数:

    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 
    
        6
  •  0
  •   hoang    15 年前

    尝试此操作,我正在使用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";
            }
        }
    }