2012-02-01 10 views
5

Non riesco a trovare il modo di analizzare in modo appropriato questo utilizzando XElement:parsing XML utilizzando XElement

<messages> 
    <message subclass="a" context="d" key="g"> 
    <message subclass="b" context="e" key="h"> 
    <message subclass="c" context="f" key="i"> 
</messages> 

mi piacerebbe ottenere questo fuori ad un elenco in cui è tre corde sottoclasse, il contesto, la chiave.

risposta

22

L'input non è XML valido, mancano i tag di chiusura sugli elementi del messaggio interno. Ma assumendo il formato era valido, si potrebbe analizzare la vostra struttura di cui:

string xml = @"<messages> 
        <message subclass=""a"" context=""d"" key=""g""/> 
        <message subclass=""b"" context=""e"" key=""h""/> 
        <message subclass=""c"" context=""f"" key=""i""/> 
       </messages>"; 

var messagesElement = XElement.Parse(xml); 
var messagesList = (from message in messagesElement.Elements("message") 
        select new 
        { 
         Subclass = message.Attribute("subclass").Value, 
         Context = message.Attribute("context").Value, 
         Key = message.Attribute("key").Value 
        }).ToList(); 

È inoltre possibile utilizzare XDocument tratta di un documento XML, e utilizzare il metodo al posto di ParseLoad se si stesse utilizzando un file XML o un flusso, per esempio. Inoltre, puoi selezionare una classe concreta se ne hai una definita. Data una definizione di classe di

class Message 
{ 
    public string Subclass { get; set; } 
    public string Context { get; set; } 
    public string Key { get; set; } 
} 

Potreste usare select new Message nella query, e il risultato sarebbe un List<Message>, mentre in questo momento si tratta di un elenco di un tipo anonimo.