2011-06-17 17 views
9

Mamy kod followig:Zmiana nazwy XmlElement dla serializacji XML

[Serializable] 
public class Class1 
{ 
    [XmlElement("description")] 
    public string Description { get; set; } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var list = new List<Class1> {new Class1() {Description = "Desc1"}, new Class1() {Description = "Desc2"}}; 
     var serializer = new XmlSerializer(typeof(List<Class1>), new XmlRootAttribute("root")); 
     var ms = new MemoryStream(); 
     serializer.Serialize(ms, list); 
     ms.Position = 0; 
     var result = new StreamReader(ms).ReadToEnd(); 
    } 
} 

po wykonaniu będziemy mieć następujące w 'Result' Zmienna:

<?xml version="1.0"?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Class1> 
    <description>Desc1</description> 
    </Class1> 
    <Class1> 
    <description>Desc2</description> 
    </Class1> 
</root> 

Pytanie brzmi: jak zmienić xml nazwy elementów od "Class1" do "Item1" bez zmiany nazwy klasy?

Odpowiedz

30

Możesz użyć do tego celu XmlTypeAttribute.TypeName.

Spróbuj to dla ciebie Class1 definicja

[XmlType(TypeName = "Item1")] 
    [Serializable] 
    public class Class1 
    { 
     [XmlElement("description")] 
     public string Description { get; set; } 
    } 
+0

Dzięki. To działa – Anubis

4

Użyć XmlTypeAttribute na klasy, a także:

[XmlType(TypeName="ElementName")] 
[Serializable] 
public class Class1 { ... 

EDIT: Aktualizacja z XmlRootAttribute do XmlTypeAttribute. Ta pierwsza działa tam, gdzie typ przekazywany do serializera jest typem przypisanym (tutaj: Class1), ale nie wtedy, gdy istnieje typ opakowania (tutaj: List<Class1>). Że XmlType prace nie wynika z dokumentacji (podkreślenie moje):

Kontroluje schematu XML który jest generowany, gdy cel atrybut jest szeregowane przez XmlSerializer.

Kredyt dla Bala R na answer.

+0

Nie sądzę XmlElementAttribute można stosować do classes.' [AttributeUsageAttribute (AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true)] public class XmlElementAttribute: Atrybut "i nie ma" AttributeTargets.Class " –

+0

System.Xml.Serialization.XmlElementAttribute ma AttributeUsage: Pole | Parametr | Właściwość | ReturnValue, ale nie typ – Anubis

+0

@ BetaR: Oops ... zły atrybut. – Richard

Powiązane problemy