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.