2008-09-17 16 views
28

Tengo un XML que quiero cargar a los objetos, manipular esos objetos (establecer valores, leer valores) y luego guardar esos XML. Es importante para mí tener el XML en la estructura (xsd) que creé.Cómo correlacionar objetos XML a C#

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

Respuesta

28

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

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

Si el esquema tiene dependencias (esquemas incluyentes y/o importados), todos ellos deben ser incluidos en la misma línea de comandos .

+11

[+1] Vale la pena señalar que también debe usar/c para generar clases y/d para generar una clase derivada de DataSet al usar un XSD. De lo contrario, aparecerá el siguiente mensaje de error "Error: solo puede generar una clase o conjuntos de datos". – Marc

0

Apuesto que NetDataContractSerializer puede hacer lo que quiera.

7

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

+2

Esta es ahora la página oficial de LINQ to XSD: http://linqtoxsd.codeplex.com/ –

+0

¿Es realmente hacer el mapeo de C# como se indica en la pregunta? – Konstantin

+0

nah, Linq To XML no se puede usar para asignar clases persistentes. –

2

Use el programa de línea de comandos xsd.exe que viene con Visual Studio para crear archivos de clase que puede usar en su proyecto/solución, y el espacio de nombres System.Xml.Serialization (específicamente, la clase XmlSerializer) para serializar/deserializar clases hacia y desde el disco.

2

usando System.Xml.Serialization; este espacio de nombres tiene todos los atributos que necesitará si desea asignar su xml a cualquier objeto aleatorio. Alternativamente, puede utilizar la herramienta xsd.exe

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

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

18

Este código (C# DotNet 1.0 en adelante) funciona bastante bien para serializar la mayoría de los objetos a XML. (Y viceversa) No funciona para los objetos que contiene ArrayLists, y si es posible utilizando sólo palo para matrices

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); 
} 
+1

Práctica rutina, pero tenga en cuenta que no funcionará en objetos que no tienen un constructor sin parámetros. – ChadD

+0

¿tenemos que escribir cualquier tipo de etiquetas de mapeo en la clase TypeToDeserialize y sus miembros? –

+0

Esto nos ayudó a convertir entre JSON.NET JSON y XML guardado en la base de datos. JSON.NET no creó XML que podría volver a corregirse a JSON para volver a usarlo, es decir, nunca descubrimos una forma de utilizar su XML generado con los métodos XML de ASP.NET. –

1

xsd.exe de Microsoft tiene un montón de errores: | Pruebe esta fuente abierta pearl http://xsd2code.codeplex.com/

+0

+1 gracias por esto. En realidad es un proyecto que está activo y tiene algo de documentación. – knownasilya

1

Hemos creado un marco que puede autogenerar clases C# fuera de su XML. Es una plantilla de elementos visuales 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.

Comprobar este enlace para la plantilla de marco y Visual C# material: click here

1

estoy de acuerdo xsd es realmente basura ... Pero hizo 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 de XSD y funciona de manera fantástica. Si tiene un generador de esquema como XML espía; crea un xsd de tu xml y usa esta herramienta. Creé clases muy complejas usando esta herramienta. A continuación, cree clases parciales para propiedades/métodos adicionales, etc. Luego, cuando actualice su esquema, simplemente regenere sus clases y las ediciones subsistan en sus clases parciales.

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

Cuestiones relacionadas