2009-10-13 9 views
8

He estado trabajando con un servicio web REST basado en Java de terceros, que devuelve una matriz de xmlNodes.xmlNodo a objetos

El xmlNode [] representa un objeto y estoy tratando de encontrar la mejor manera de deserializar el xmlNode [] en el objeto? ¿es construir primero un xmlDocument y el Deserialize?

Gracias

Respuesta

22

Si tiene instalado el kit de previsualización WCF Resto de arranque, hay un truco:

  • abra Visual Studio
  • elegir sus contenidos nodo XML (el XML que conforma uno de los nodos) y copiar en el portapapeles
  • desde el menú "Editar" en Visual Studio, elige "XML pegar como Tipos"

Esto pegará el código XML que está en el portapapeles en el proyecto como una clase C# que es capaz de deserializar ese XML exacto. ¡Bastante ingenioso!

ver estas entradas de blog al respecto:

Eso debería guardar un montón de escribir y hacer la vida mucho más fácil!

ACTUALIZACIÓN:
bien, ya tiene sus clases generadas a partir del XML que vuelvas. Ahora necesita convertir un XmlNode a su clase.

Vas a tener que hacer algo como esto:

private static T ConvertNode<T>(XmlNode node) where T: class 
{ 
    MemoryStream stm = new MemoryStream(); 

    StreamWriter stw = new StreamWriter(stm); 
    stw.Write(node.OuterXml); 
    stw.Flush(); 

    stm.Position = 0; 

    XmlSerializer ser = new XmlSerializer(typeof(T)); 
    T result = (ser.Deserialize(stm) as T); 

    return result; 
} 

tiene que escribir la representación XML (propiedad .OuterXml) del XmlNode a una corriente (en este caso un MemoryStream) y luego usar el XmlSerializer para serializar respaldar el objeto de esa corriente

Puede hacerlo con el método genérico y llamar

Customer myCustomer = ConvertNode<Customer>(xmlNode); 

o incluso se podría convertir ese código en cualquiera de un método de extensión de la clase XmlNode por lo que podría escribir:

Customer myCustomer = xmlNode.ConvertNode<Customer>(); 

Marc

+0

Hola, ya tengo los objetos del xsd, así que realmente no necesito hacer este paso. Estoy queriendo aprender cuál es la mejor manera de ir desde xmlNodes [] (objeto serializado). – 76mel

-1

La forma más sencilla de hacerlo sería utilizar el construido en la clase System.Xml.Serialization.XmlSerializer en .NET. Una búsqueda de Google en XmlSerializer proporcionará un montón de tutoriales que puede utilizar para encontrar un tutorial que le resulte útil.

+1

Obvio y no útil. Por supuesto que necesito XMLSerializer, pero tengo un nodo XML y no una cadena o una secuencia. Afortunadamente, una búsqueda en Google proporciona la otra respuesta útil a esta pregunta – edc65

4

Puede ser que ya es demasiado tarde para responder aquí, pero ayudará a los demás:

Aquí está la solución que podrá Deserialize del nodo XML.

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 

XmlNode xmlNode = xmlDoc.SelectSingleNode("//SystemInfo"); 

XmlSerializer serial = new XmlSerializer(typeof(SystemInfo)); 

SystemInfo syso =(SystemInfo)serial.Deserialize(new XmlNodeReader(xmlNode)); 

primera carga el XML a XmlDocument Object y luego encontrar el nodo padre le deseo deserializar al igual que yo quiero SystemInfo nodo de objetos de todo el documento XML.

Una vez que encuentre que crear un objeto XmlSerializer con el tipo de clase específico que desee.

Ahora sólo tiene que pasar la new XmlNodeReader(xmlNode) a la método Deserialize, obtendrá los objetos pobladas en el objeto de una clase al igual que yo pobladas syso objeto con valores XML.

Happy Coding :)