Pregunta

Tengo un .Net webserivce que acepte XML en formato de cadena. XML cadena enviada al webserivce puede representar cualquier objeto en el sistema. Tengo que comprobar el primer nodo de averiguar qué objeto deserializar la cadena XML. Para ello voy a tener que cargar el XML en un XMLDocument (no quieren usar expresiones regulares o comparación de cadenas). Me pregunto si hay una manera de deserializar el XMLDocument/XMLNode vez que deserializar la cadena para ahorrar algo de rendimiento? ¿Va a haber ninguna ventaja de rendimiento serializar el XMLNode vez que la cadena?

Método para cargar XMLDocument

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

Gracias

¿Fue útil?

Solución

Si usted tiene una XmlDocument, se puede utilizar como un XmlNodeReader XmlReader para pasar a XmlSerializer, pero me pregunto si sería mejor hacerlo a la inversa; 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);
            }
        }            
    }
}

Otros consejos

No se olvide un poderoso contendiente, LINQ to XML!

XElement root = XElement.Load(myfile);

var foos = root.Descendants("Foo").Where(e => e.Attribute("bar") != null);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top