XML Serialization of List - XML Root

前端 未结 4 1106
说谎
说谎 2020-12-05 03:42

First question on Stackoverflow (.Net 2.0):

So I am trying to return an XML of a List with the following:

public XmlDocument GetEntityXml()
    {             


        
相关标签:
4条回答
  • 2020-12-05 03:57

    There is a much easy way:

    public XmlDocument GetEntityXml<T>()
    {
        XmlDocument xmlDoc = new XmlDocument();
        XPathNavigator nav = xmlDoc.CreateNavigator();
        using (XmlWriter writer = nav.AppendChild())
        {
            XmlSerializer ser = new XmlSerializer(typeof(List<T>), new XmlRootAttribute("TheRootElementName"));
            ser.Serialize(writer, parameters);
        }
        return xmlDoc;
    }
    
    0 讨论(0)
  • 2020-12-05 03:57

    so simple....

    public static XElement ToXML<T>(this IList<T> lstToConvert, Func<T, bool> filter, string rootName)
    {
        var lstConvert = (filter == null) ? lstToConvert : lstToConvert.Where(filter);
        return new XElement(rootName,
           (from node in lstConvert
           select new XElement(typeof(T).ToString(),
           from subnode in node.GetType().GetProperties()
           select new XElement(subnode.Name, subnode.GetValue(node, null)))));
    
    }
    
    0 讨论(0)
  • 2020-12-05 04:07

    If I understand correctly, you want the root of the document to always be the same, whatever the type of element in the collection ? In that case you can use XmlAttributeOverrides :

           XmlAttributeOverrides overrides = new XmlAttributeOverrides();
           XmlAttributes attr = new XmlAttributes();
           attr.XmlRoot = new XmlRootAttribute("TheRootElementName");
           overrides.Add(typeof(List<T>), attr);
           XmlSerializer serializer = new XmlSerializer(typeof(List<T>), overrides);
           List<T> parameters = GetAll();
           serializer.Serialize(xmlWriter, parameters);
    
    0 讨论(0)
  • 2020-12-05 04:09

    A better way to the same thing:

    public XmlDocument GetEntityXml<T>()
    {
        XmlAttributeOverrides overrides = new XmlAttributeOverrides();
        XmlAttributes attr = new XmlAttributes();
        attr.XmlRoot = new XmlRootAttribute("TheRootElementName");
        overrides.Add(typeof(List<T>), attr);
    
        XmlDocument xmlDoc = new XmlDocument();
        XPathNavigator nav = xmlDoc.CreateNavigator();
        using (XmlWriter writer = nav.AppendChild())
        {
            XmlSerializer ser = new XmlSerializer(typeof(List<T>), overrides);
            List<T> parameters = GetAll<T>();
            ser.Serialize(writer, parameters);
        }
        return xmlDoc;
    }
    
    0 讨论(0)
提交回复
热议问题