2010-04-22 13 views
8

Tengo una webserivce .Net que acepta XML en formato de cadena. XML La cadena enviada a la webserivce puede representar cualquier Objeto en el sistema. Necesito verificar el primer nodo para descubrir qué objeto deserializar la cadena XML. Para esto tendré que cargar el XML en un XMLDocument (No quiero usar RegEx o una cadena de comparación). Me pregunto si hay una manera de deserializar el XMLDocument/XMLNode en lugar de deserializar la cadena para ahorrar algo de rendimiento. ¿Habrá algún beneficio de rendimiento serializando el XMLNode en lugar de la cadena?¿Cómo deserializar XMLDocument para objetar en C#?

Método para cargar XMLDocument

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

Gracias

Respuesta

22

Si usted tiene una XmlDocument, puede utilizar XmlNodeReader como XmlReader para pasar a XmlSerializer, pero me pregunto si sería mejor que hacerlo de la Otra manera; utilizar un XmlReader para obtener el nombre del elemento más externo, y dar a que a 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

Maldición, finalmente una pregunta que podría responder con los ojos cerrados, me la ganaste :). – johnc

+0

Gracias, intentaré esto. – Deepfreezed

2

No se olvide un competidor potente, LINQ to XML!

XElement root = XElement.Load(myfile); 

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

La aplicación en la que estoy trabajando está bloqueada en .Net 2.0. Ojalá ese no fuera el caso. – Deepfreezed

+0

no se olvide de agregar System.Xml.Linq a las referencias de su programa –

Cuestiones relacionadas