serialize serializar query example ejemplos deserializar c# xml compact-framework xsd xmldocument

c# - serializar - Lee objetos escritos a partir de XML usando XSD conocido



system xml linq example c# (2)

Necesitas hacer dos pasos:

1) Tome su archivo de esquema XML y ejecútelo a través de la utilidad xsd.exe (que viene con el SDK de Windows; está en C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bin/ o alguna ruta similar. Esto puede convertir el archivo XSD en una clase de C #:

xsd /c yourfile.xsd

Esto debería proporcionarle un archivo yourfile.cs que contenga una clase que represente ese esquema XML.

2) Ahora, armado con esa clase C #, deberías poder simplemente deserializar el archivo XML en una instancia de tu nuevo objeto:

XmlSerializer ser = new XmlSerializer(typeof(foo)); string filename = Path.Combine(FilePath, "SimpleFields.xml"); foo myFoo = ser.Deserialize(new FileStream(filename, FileMode.Open)) as foo; if (myFoo != null) { // do whatever you want with your "foo" }

¡Eso es lo más simple que puede ser! :-)

Tengo el siguiente (como ejemplo) archivo XML y XSD.

<?xml version="1.0" encoding="utf-8" ?> <foo> <DateVal>2010-02-18T01:02:03</DateVal> <TimeVal>PT10H5M3S</TimeVal> </foo>

y

version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="foo"> <xs:complexType> <xs:sequence> <xs:element name="DateVal" type="xs:dateTime" /> <xs:element name="TimeVal" type="xs:duration" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

Luego el siguiente código C #:

static void Main(string[] args) { XmlDocument xd = new XmlDocument(); XmlSchema xs; using (var fs = File.OpenRead(FilePath + "SimpleFields.xsd")) { xs = XmlSchema.Read(fs, null); } xd.Schemas.Add(xs); xd.Load((FilePath + "SimpleFields.xml")); xd.Validate(null); var el_root = xd.DocumentElement; var el_date = (XmlElement)el_root.SelectSingleNode("./DateVal"); //WANTED: el_date.Value = 2010-02-18 01:02:03 (as a DateTime Object) //ACTUAL: el_date.InnerText="2010-02-18T01:02:03" var el_duration = (XmlElement)el_root.SelectSingleNode("./TimeVal"); //WANTED: el_date.Value = 10 hours, 5 minutes, 3 seconds (as a TimeSpan Object) //ACTUAL: el_date.InnerText="PT10H5M3S" Console.WriteLine("DONE"); Console.ReadLine(); }

¿Cómo puedo leer los datos como objetos fuertemente tipados?

Me dirigiré a un dispositivo WindowsMobile, pero esto no debería afectar demasiado la respuesta. (Puede ser .NET 2.0 o 3.5 ... No estoy seguro de si Sstem.Xml.Linq ayudará o no)


OK - Encontré la respuesta que estaba buscando.

Es la clase XmlConvert.

var el_date = (XmlElement)el_root.SelectSingleNode("./DateVal"); //WANTED: el_date.Value = 2010-02-18 01:02:03 (as a DateTime Object) var val_date = XmlConvert.ToDateTime(el_date.InnerText); //ACTUAL: el_date.InnerText="2010-02-18T01:02:03" var el_duration = (XmlElement)el_root.SelectSingleNode("./TimeVal"); //WANTED: el_date.Value = 10 hours, 5 minutes, 3 seconds (as a TimeSpan Object) var val_duration = XmlConvert.ToTimeSpan(el_duration.InnerText); //ACTUAL: el_date.InnerText="PT10H5M3S"

La respuesta de Marc fue correcta en lo que respecta a la lectura en una clase entera de tipos fuertes, pero en este caso solo quería leer un único elemento / nodo con tipos fuertes.