2009-11-18 1 views
5

Sto avendo un problema cercando di deserialise questo XML:Come posso deserializzare un elemento XML in una matrice di elementi con attributi e testo in C#?

<?xml version="1.0" encoding="UTF-8"?> 
<links> 
    <link title="ABC">http://abc.co.uk</link> 
    <link title="eBay">http://ebay.co.uk</link> 
    <link title="Best Damn Site on the Web">http://stackoverflow.com</link> 
</links> 

Utilizzando il codice:

[XmlRoot("links")] 
public class LinksInterface 
{ 
    [XmlElement("link")] 
    public List<LinkElement> Links; 

    public class LinkElement 
    { 
     [XmlAttribute("title")] 
     public string Title; 
     [XmlText] // This bit is the troublesome bit! 
     public LinkElement Link; 
    } 
} 

Fondamentalmente, ho bisogno di mettere il contenuto del testo dell'elemento nella Links.Link ma l'attributo sono provare [XmlText] non fornisce il comportamento che mi aspetto e ottengo l'errore:

C'è stato un errore che riflette il campo 'Collegamenti'..

Se qualcuno potesse segnalare l'errore dei miei modi, sarei molto grato!

Grazie.

risposta

5

Forse basta usare string:

[XmlText] 
public string Link {get;set;} 

Al momento la classe è ricorsiva (un albero) - Non credo che è quello desiderato.

(ho anche passato a una proprietà, ma che non è il problema - string è il biggie, ma ci sono sacco dei motivi per utilizzare le proprietà invece di campi, e di auto-proprietà (C# 3.0) c'è sono poche scuse per non)


Modifica: prova anche a guardare l'eccezione più interna; in questo caso, il messaggio è:

Cannot serialize member 'Link' of type LinksInterface.LinkElement. XmlAttribute/XmlText cannot be used to encode complex types.

che dà un ragionevole indicazione di dove il problema è ;-p

+0

Doh! Marc ben chiazzato :) – Ryall

+0

Anche cambiato in proprietà anziché in campi. Grazie per il consiglio. – Ryall

+0

Ignora il -1 ... fa clic sulla freccia giù per errore, non mi consente di ripristinarlo ... Mi spiace: S – Ryall

0

leggi questo articolo XML Serialization in C#. L'autore utilizza un getter/setter per aggiungere elementi alla raccolta (matrice nell'articolo) e applicare l'attributo [XmlElement("link")] al getter/setter.

Cheers.