2010-04-22 13 views
8

Possiedo una webserivce .Net che accetta XML in formato stringa. XML La stringa inviata a webserivce può rappresentare qualsiasi oggetto nel sistema. Devo controllare il primo nodo per capire quale oggetto deserializzare la stringa XML. Per questo dovrò caricare l'XML in un XMLDocument (Non voglio usare RegEx o string paragonare). Mi chiedo se esiste un modo per deserializzare lo XMLDocument/XMLNode piuttosto che deserializzare la stringa per risparmiare un po 'di prestazioni? Ci sarà qualche vantaggio sulle prestazioni che serializza il XMLNode piuttosto che la stringa?Come deserializzare XMLDocument per oggetto in C#?

metodo per caricare XMLDocument

public void LoadFromString(String s) 
{ 
    m_XmlDoc = new XmlDocument(); 
    m_XmlDoc.LoadXml(s);   
} 

Grazie

risposta

22

Se avete un XmlDocument, è possibile utilizzare XmlNodeReader come XmlReader da passare a XmlSerializer, ma mi chiedo se sarebbe stato meglio farlo il altro modo; utilizzare un XmlReader per ottenere il nome dell'elemento più esterno, e dare che-XmlSerializer ...

[XmlRoot("foo")] 
public class Foo 
{ 
    [XmlAttribute("id")] 
    public int Id { get; set; } 
} 
static class Program 
{ 
    static void Main() 
    { 
     string xml = "<foo id='123'/>"; 
     object obj; 
     using (XmlReader reader = XmlReader.Create(new StringReader(xml))) 
     { 
      reader.MoveToContent(); 
      switch (reader.Name) 
      { 
       case "foo": 
        obj = new XmlSerializer(typeof(Foo)).Deserialize(reader); 
        break; 
       default: 
        throw new NotSupportedException("Unexpected: " + reader.Name); 
      } 
     }    
    } 
} 
+0

Dannazione, finalmente una domanda che potrei rispondere con gli occhi chiusi, mi hai battuto ad esso :). – johnc

+0

Grazie, farò un tentativo. – Deepfreezed

2

Non dimenticare un concorrente potente, LINQ to XML!

XElement root = XElement.Load(myfile); 

var foos = root.Descendants("Foo").Where(e => e.Attribute("bar") != null); 
+0

L'applicazione su cui sto lavorando è bloccata su .Net 2.0. Vorrei che non fosse il caso. – Deepfreezed

+0

non dimenticare di aggiungere System.Xml.Linq ai riferimenti del programma –

Problemi correlati