سؤال

السؤال الأول على Stackoverflow (.NET 2.0):

لذلك أحاول إرجاع XML من القائمة بما يلي:

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

الآن سيتم استخدام هذا لكيانات متعددة التي حددتها بالفعل.

قل أود الحصول على XML من List<Cat>

سيكون XML شيئا مثل:

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

هل هناك طريقة بالنسبة لي للحصول على نفس الجذر طوال الوقت عند الحصول على هذه الكيانات؟

مثال:

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

لاحظ أيضا أنني لا أنوي استخدام XML مرة أخرى List<Cat>

هل كانت مفيدة؟

المحلول

هناك طريقة سهلة للغاية:

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

نصائح أخرى

إذا فهمت بشكل صحيح، فأنت تريد أن تكون جذر المستند هو نفسه دائما، أيا كان نوع العنصر في المجموعة؟ في هذه الحالة، يمكنك استخدام xmlattributeolidrides:

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

طريقة أفضل لنفس الشيء:

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

بسيط جدا....

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

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top