views:

3286

answers:

4

First question on Stackoverflow (.Net 2.0):

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

public XmlDocument GetEntityXml()
    {        
        StringWriter stringWriter = new StringWriter();
        XmlDocument xmlDoc = new XmlDocument();            

        XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter);

        XmlSerializer serializer = new XmlSerializer(typeof(List<T>));

        List<T> parameters = GetAll();

        serializer.Serialize(xmlWriter, parameters);

        string xmlResult = stringWriter.ToString();

        xmlDoc.LoadXml(xmlResult);

        return xmlDoc;
    }

Now this will be used for multiple Entities I have already defined.

Say I would like to get an XML of List<Cat>

The XML would be something like:

<ArrayOfCat>
  <Cat>
    <Name>Tom</Name>
    <Age>2</Age>
  </Cat>
  <Cat>
    <Name>Bob</Name>
    <Age>3</Age>
  </Cat>
</ArrayOfCat>

Is there a way for me to get the same Root all the time when getting these Entities?

Example:

<Entity>
  <Cat>
    <Name>Tom</Name>
    <Age>2</Age>
  </Cat>
  <Cat>
    <Name>Bob</Name>
    <Age>3</Age>
  </Cat>
</Entity>

Also note that I do not intend to Deserialize the XML back to List<Cat>

+4  A: 

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);
Thomas Levesque
Great, worked like a charm.Thanks
Metju
+2  A: 

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;
}
John Saunders
Do you mind explaining why it is better though?
Metju
The main thing is that it serializes directly into the XmlDocument. Your code required parsing the results in order to get them back into the document. Your code also used XmlTextWriter, which is largely obsolete.
John Saunders
Understood, thanks a lot.
Metju
+6  A: 

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;
        }
Suminder
A: 

so simple....

public static XElement ToXML(this IList lstToConvert, Func 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)))));

    }
abdul kader jeelani