Cómo Deserialize XMLDocument a objetos en C #?
-
01-10-2019 - |
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
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);