Estoy recibiendo cadenas XML sobre un socket, y me gustaría convertirlas en objetos C #.
Los mensajes son de la forma:
<msg>
<id>1</id>
<action>stop</action>
</msg>
Soy nuevo en .Net, y no estoy seguro de la mejor práctica para realizar esto. He usado JAXB para Java anteriormente, y no estaba seguro de si hay algo similar, o si esto se manejaría de una manera diferente.
c#
xml
xml-parsing
xml-serialization
Steve
fuente
fuente
Respuestas:
Debe usar la
xsd.exe
herramienta que se instala con el SDK de Windows en un directorio similar a:Y en computadoras de 64 bits:
Y en computadoras con Windows 10:
En la primera ejecución, usa
xsd.exe
y convierte su XML de muestra en un archivo XSD (archivo de esquema XML):Esto le da
yourfile.xsd
, que en un segundo paso, puede convertir nuevamente usandoxsd.exe
una clase de C #:Esto debería darle un archivo
yourfile.cs
que contendrá una clase C # que puede usar para deserializar el archivo XML que está obteniendo, algo como:Debería funcionar bastante bien para la mayoría de los casos.
Actualización: el serializador XML tomará cualquier flujo como su entrada, ya sea un archivo o un flujo de memoria estará bien:
o use un StringReader:
fuente
Tienes dos posibilidades.
Método 1. Herramienta XSD
Suponga que tiene su archivo XML en esta ubicación
C:\path\to\xml\file.xml
Puede encontrarlo en
Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
O si tiene Windows 8 puede comenzar a escribir el símbolo del sistema del desarrollador en la pantalla de iniciocd /D "C:\path\to\xml"
xsd file.xml
xsd /c file.xsd
¡Y eso es! Ha generado clases de C # desde un archivo xml en
C:\path\to\xml\file.cs
Método 2 - Pasta especial
Requiere Visual Studio 2012+ con .Net Framework> = 4.5 como objetivo del proyecto y componente individual 'Windows Communication Foundation' instalado
Edit > Paste special > Paste XML As Classes
¡Y eso es!
Uso
El uso es muy simple con esta clase auxiliar:
Todo lo que tienes que hacer ahora es:
fuente
Pruebe este método para convertir Xml a un objeto. Está hecho exactamente para lo que está haciendo:
Llámalo usando este código:
fuente
Simplemente ejecute su Visual Studio 2013 como Administración ... Copie el contenido de su archivo Xml. Vaya a Visual Studio 2013> Editar> Pegado especial> Pegar Xml como clases C # Creará sus clases C # de acuerdo con el contenido de su archivo Xml.
fuente
En caso de que alguien pueda encontrar esto útil:
Puedes llamarlo usando:
fuente
Puede generar la clase como se describe anteriormente, o escribirlos manualmente:
Luego puede usar ExtendedXmlSerializer para serializar y deserializar.
Instalación Puede instalar ExtendedXmlSerializer desde nuget o ejecutar el siguiente comando:
Publicación por entregas:
Deserialización
Este soporte de serializador:
ExtendedXmlSerializer admite .NET 4.5 o superior y .NET Core . Puede integrarlo con WebApi y AspCore.
fuente
Puede usar xsd.exe para crear clases vinculadas a esquemas en .Net y luego XmlSerializer para deserializar la cadena: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx
fuente
Simplificando la gran respuesta de Damian,
fuente
Utilice el siguiente método para convertir cadenas XML a DTO utilizando JAXB
fuente
Si tiene el xsd del mensaje xml, puede generar clases de C # con la herramienta .Net xsd.exe.
Estas clases .Net se pueden usar para generar el xml.
fuente
Además de las otras respuestas aquí, puede usar naturalmente la clase XmlDocument , para lectura similar a XML DOM, o el XmlReader , lector de avance rápido, para hacerlo "a mano".
fuente
Otra forma con herramientas avanzadas de generación de clases de xsd a c #: xsd2code.com. Esta herramienta es muy útil y poderosa. Tiene mucha más personalización que la herramienta xsd.exe de Visual Studio. Xsd2Code ++ se puede personalizar para usar listas o matrices y admite esquemas grandes con muchas declaraciones de importación.
Nota de algunas características,
fuente
Sé que esta pregunta es antigua, pero me topé con ella y tengo una respuesta diferente que, bueno, todos los demás :-)
La forma habitual (como mencionan los comentaristas anteriores) es generar una clase y deserializar su xml.
Pero ( advertencia: autopromoción descarada aquí ) acabo de publicar un paquete nuget, aquí , con el que no tienes que hacerlo. Solo tienes que ir:
Eso es literalmente, no se necesita nada más. Y, lo más importante, si su xml cambia, su objeto también cambia automáticamente.
Si prefiere descargar el dll directamente, la página de github está aquí .
fuente
fuente