2011-07-06 18 views
7

Estoy escribiendo un cliente para un protocolo que usa HTTP para transportar mensajes XML. Es sincrónico porque formo un documento XML que sigue una DTD y lo envío a una puerta de enlace para el protocolo mediante POST con la clase WebClient y obtengo un mensaje de respuesta XML del servidor remoto para indicar el estado de la transacción/ID del mensaje/etc.Deserializar mensajes XML a objetos

Como tengo el DTD, ¿es posible crear clases con él? Hay un puñado de respuestas posibles para cada tipo de "operación" que está realizando mi mensaje XML y sería ventajoso tener clases que pudieran ser hidratadas por el XML del servidor devuelto.

Una vez que tengo esas clases, ¿cuáles son los pasos básicos para deserializar el mensaje XML del servidor en objetos?

Respuesta

4

encubierta la DTD para XSD (no sé si sigue siendo necesario este paso):

Free DTD to XSD conversion utility?

Generar clase C# de la herramienta de línea de XSD (mando, así es como lo hago, no estoy seguro si hay una manera mejor):

http://quickstart.developerfusion.co.uk/quickstart/howto/doc/xmlserialization/XSDToCls.aspx

Serialize de nuevo a clase a partir de XML:

http://support.microsoft.com/kb/815813

+0

Esto definitivamente me ayuda a comenzar lo que me propuse hacer. Convertí el DTD a XSD usando trang y generé clases del nuevo archivo XSD. Debería ser fácil completar el código para serializar y deserializar desde aquí. ¡Gracias! – jlafay

1

una vez que tenga la cadena xml, puede hacer algo como esto donde T es su objeto genérico.

public static T GetObjectFromXmlString<T>(string xml) 
{ 
    T result = default(T); 

    if (string.IsNullOrEmpty(xml)) 
     return result; 

    using (StringReader sr = new StringReader(xml)) 
    { 
     using (XmlTextReader xr = new XmlTextReader(sr)) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      result = (T)serializer.Deserialize(xr); 
     }     
    } 

    return result; 
} 
+0

Bien, tendré que intentar eso. ¿Tendría una solución para la otra parte de mi pregunta? Me gustaría un proceso trivial para generar las clases desde la DTD. Probaré las sugerencias de Eric H, pero esperaba .Net o VS2010 tendrían una herramienta para ayudar con eso. – jlafay

+0

no tengo una forma mejor de generar clases desde DTD. No estoy seguro de sus requisitos, pero si tiene que generarlo una vez (dtd es estático), iría con alguna herramienta. pero si tiene que generar clases dinámicamente, podría leer el archivo dtd y usar el reflejo para crear clases o ensamblajes. solo un pensamiento. –

+0

Sí, fui con una herramienta porque es estática porque es un protocolo. – jlafay

Cuestiones relacionadas