Cómo mapeo XML a objetos C #


Tengo un XML que quiero cargar en objetos, manipular esos objetos (establecer valores, leer valores) y luego guardar esos XMLs de nuevo. Es importante para mí tener el XML en la estructura (xsd) que he creado.

Una forma de hacerlo es escribir mi propio serializador, pero ¿hay un soporte incorporado para él o código abierto en C# que pueda usar?

Author: Chris, 2008-09-18

9 answers

Puede generar clases C# serializables a partir de un esquema (xsd) usando xsd.exe:

xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir

Si el esquema tiene dependencias (esquemas incluidos/importados), todas deben incluirse en la misma línea de comandos.

 28
Author: ckarras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 21:03:24

Este código (C# DotNet 1.0 en adelante) funciona bastante bien para serializar la mayoría de los objetos a XML. (y atrás) No funciona para objetos que contienen ArrayLists, y si es posible se adhieren a usar solo Arrays

using System;    
using System.IO;
using System.Text;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;


public static string Serialize(object objectToSerialize)
{
    MemoryStream mem = new MemoryStream();          
    XmlSerializer ser = new XmlSerializer(objectToSerialize.GetType());         
    ser.Serialize(mem, objectToSerialize);                      
    ASCIIEncoding ascii = new ASCIIEncoding();
    return ascii.GetString(mem.ToArray());
}        

public static object Deserialize(Type typeToDeserialize, string xmlString)
{
    byte[] bytes = Encoding.UTF8.GetBytes(xmlString);
    MemoryStream mem = new MemoryStream(bytes);         
    XmlSerializer ser = new XmlSerializer(typeToDeserialize);
    return ser.Deserialize(mem);
}
 18
Author: Shimmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 23:38:46

LINQ to XML es muy potente si usted está utilizando .net 3.5, LINQ to XSD puede ser útil para usted también!

 7
Author: ljs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 21:02:47

Use xsd.programa de línea de comandos exe que viene con visual studio para crear archivos de clase que puede usar en su proyecto / solución y en el Sistema.XML.Espacio de nombres de serialización (específicamente, la clase XmlSerializer) para serializar / deserializar esas clases hacia y desde el disco.

 2
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 21:03:00

Usando el Sistema.XML.Serialización; este espacio de nombres tiene todos los atributos que necesitará si desea asignar su xml a cualquier objeto aleatorio. Alternativamente puede usar el xsd.herramienta exe

Archivo Xsd.xsd {/classes / / dataset} [/element: element] [/language: language] [/namespace: namespace] [/outputdir:directory] [URI: uri] que tomará sus archivos xsd y creará c # o vb.net clases fuera de ellos.

Http://msdn.microsoft.com/en-us/library/x6c1kb0s (VS.71).aspx

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 21:07:33

Estoy de acuerdo en que xsd es realmente una mierda... Pero hicieron otra versión que casi nadie conoce. Se llama generador de objetos xsd. Es la próxima versión y tiene muchas más opciones. Genera archivos desde XSD y funciona de forma fantástica. Si tiene un generador de esquemas como XML spy, cree un xsd a partir de su xml y utilice esta herramienta. He creado clases muy muy complejas usando esta herramienta. Luego cree clases parciales para propiedades adicionales\métodos, etc., luego cuando actualice su esquema, las clases y cualquier edición persisten en sus clases parciales.

Http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=7075

 1
Author: Steve Coleman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-19 22:11:20

Xsd.exe de Microsoft tiene muchos errores: | Prueba este código abierto pearl http://xsd2code.codeplex.com /

 1
Author: binball,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-24 08:04:11

Hemos creado un framework que puede generar automáticamente clases de C# a partir de su XML. Es una plantilla de elemento visual a la que pasa su XML y las clases se generan automáticamente en su proyecto. Usando estas clases puedes crear / leer / escribir tu XML.

Compruebe este enlace para el marco y la plantilla de elemento visual de C#: haga clic aquí

 1
Author: Savaratkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-16 22:02:44

Apuesto a que NetDataContractSerializer puede hacer lo que quieras.

 0
Author: dcstraw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 21:02:19