2009-08-06 33 views
13
Stackoverflow (.Net 2.0) üzerinde

İlk soru: ŞimdiXML Serialization - XML ​​Kök

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

bu irade:

Yani şu bir listesi bir XML döndürmek çalışıyorum Zaten tanımladığım birden fazla varlık için kullanılmalıdır. Bu Varlıkları alırken bana aynı kök hep almak için bir yolu var mı

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

:

XML gibi bir şey olurdu List<Cat>

bir XML almak istiyorum deyin ?

Örnek:

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

Ayrıca geri List<Cat>

+0

"Aynı Root'u her zaman al" dan ne demek istiyorsunuz? Lütfen daha fazla bilgi verin ... –

cevap

30

çok kolay bir yolu vardır:

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

XML Deserialize Eğer doğru anlamak, dokümanın kök hep aynı olmak istiyorum niyetinde olmadığını unutmayın ne olursa olsun Koleksiyondaki elemanın türü? Bu durumda XmlAttributeOverrides kullanabilirsiniz:

 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

Harika, çekicilik gibi çalıştı. Teşekkürler –

6

aynı şey daha iyi bir yolu:

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

Neden daha iyi olduğunu açıklayan bir sakıncası var mı? –

+0

Ana şey, doğrudan XmlDocument içine seri hale getirilmesidir. Kodunuz, sonuçları dokümana geri almak için sonuçları ayrıştırmak gerekiyordu. Kodunuz, büyük ölçüde eski olan XmlTextWriter'i de kullandı. –

+0

Anlayın, çok teşekkürler. –

2

kadar basit ....

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

Sadece bir seviye aşağı iniyorsunuz. Tabii ki basit. – James

İlgili konular