2011-11-24 4 views
16

Chcę utworzyć niestandardową strukturę XML w następujący sposób:Jak ustawić nazwę elementu XmlArrayItem dla implementacji List <Custom>?

<Hotels> 
    <Hotel /> 
</Hotels> 

Utworzyłem implementację List tylko żeby być w stanie to zrobić. Mój kod wygląda następująco:

[XmlRootAttribute(ElementName="Hotels")] 
public class HotelList: List<HotelBasic> 

Ponieważ klasa ta lista nie posiada nazwie Hotel ale HotelBasic mój xml jest jak

<Hotels> 
    <HotelBasic /> 
</Hotels> 

Jak mogę to naprawić bez konieczności wdrożenia ISerializable lub IEnumerable?

+0

Czy chcesz serializować lub deserializować? – abatishchev

Odpowiedz

14

Zakładając, że używasz XmlSerializer, jeśli wszystko, co chcesz zrobić, to zmienić sposób klasa HotelBasic jest seryjny, można użyć XmlTypeAttribute:

[XmlType(TypeName = "Hotel")] 
public class HotelBasic 
{ 
    public string Name { get; set; } 
} 

przypadku użycia z klasy HotelList będzie szeregowane jako:

<Hotels xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Hotel> 
    <Name>One</Name> 
    </Hotel> 
    <Hotel> 
    <Name>Two</Name> 
    </Hotel> 
</Hotels> 
22
[XmlArray("Hotels")] 
[XmlArrayItem(typeof(Hotel), ElementName="Hotel")] 
public HotelList[] Messages { get; set; } 

powinna produkować:

<Hotels> 
    <Hotel /> 
    <Hotel /> 
</Hotels> 

[XmlRoot("Hotels")] 
public class HotelList : IXmlSerializable 
{ 
    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     this.Hotels = XDocument.Load(reader) 
           .Select(h => new Hotel { Name = (string)h.Attribute("name") } 
           .ToList(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     throw new NotSupportedException(); 
    } 
} 
+0

Potrzebuję użyć listy , a nie HotelBasic [] – Odys

+0

@odyodyodys: 1. XmlSerializer obsługuje tylko tablicę. 2. Poprosiłeś o 'IEnumerable ', tablica go implementuje. 3. Nie chcesz 'List ', ponieważ jest to zbędny kontener, ale lista w xml to * final *. 4. Możesz stworzyć listę nazywającą 'ToList()'. – abatishchev

+0

Używam metod "List", takich jak Znajdź i wiele więcej. Byłoby po prostu trudem, aby ponownie zaimplementować 'List' – Odys

6

myślę madd0 przedstawia najprostszą opcję dla ciebie tutaj, ale tylko dla zasady ... osobiście nie polecam „serializacji listę jako obiekt główny "- z różnych powodów (w tym: widziałem, że te atrybuty nie działają na co najmniej na platformie - mogły to być CF lub SL, nie pamiętam). Zamiast tego, zawsze doradzamy przy użyciu niestandardowego typu root:

[XmlRoot("Hotels")] 
public class HotelResult // or something similar 
{ 
    [XmlElement("Hotel")] 
    public List<HotelBasic> Hotels { get { return hotel; } } 

    private readonly List<HotelBasic> hotels = new List<HotelBasic>(); 
} 

będzie to miało taką samą strukturę XML i pozwala na większą elastyczność (można dodać inne atrybuty/elementów do katalogu głównego), a nie do pieczenia List<T> Twój typ modelu (preferuj hermetyzację nad dziedziczeniem itp.).

Powiązane problemy