visual valid net name generate example comment comentarios c# .net xml-parsing xml-serialization xml-deserialization

c# - valid - Deserialización genérica de XML en objetos indefinidos



xml comments c# (2)

Tengo un archivo XML muy extenso y muy variado con el que intento almacenar porciones en una base de datos. Ahora, no quiero pasar y escribir a mano 10.000 objetos diferentes para almacenar los datos deserializados. ¿Hay alguna forma de definir un Objeto basado en lo que se encuentra en el archivo XML?

Por ejemplo, si tuviera:

<objecttype1> <attr1>Some string of text</attr1> </objecttype1> <objecttype1> <attr2>123456789</attr2> </objecttype1>

Me gustaría que se definiera un objeto similar al siguiente:

public class objecttype1 { public string attr1 {get; set;} public string attr2 {get; set;} }

Básicamente, quiero deserializar todo el documento xml en una variedad de objetos diferentes con algún tipo de estructura jerárquica que represente el documento xml original, y luego extraer datos de esos objetos para ponerlos en mi base de datos según su tipo. ¿Hay alguna forma / una mejor manera de hacer esto?


En resumen, no hay forma de deserializar el tipo de XML en el tipo concreto nombrado por contenido XML . Para poder deserializar xml en el tipo concreto dado, debe tener ese tipo definido en su código. O tal vez tenga una estructura de tipo diferente, que tendrá TypeName en su definición (desde donde se creó, es decir, el nombre de la etiqueta en xml).

Lo único que la deserialización del objeto dinámico te da es que acabarás teniendo algún tipo de tipo dinámico con todas esas propiedades.

No deserializaría XML en objeto dinámico si tuviera que guardarlo en la base de datos. En cambio, ¿usaría el modelo de objeto de documento XML (XmlDocument?) Para leer y luego guardar en la base de datos. De lo contrario, terminará teniendo un objeto con todas las propiedades de cadena y luego guardándolos. Parece ser solo un paso redundante para deserializar en objeto.

Además, deserializar en objeto dinámico (como lo sugiere la respuesta), no le dará diferentes tipos de objetos (al menos no con esos tipos en XML).


Está buscando un ExpandoObject .
ExpandoObject es un objeto dinámico introducido en C # 4.
Implementación de ejemplo encontrada aquí :

public static IEnumerable<dynamic> GetExpandoFromXml(string file, string descendantid) { var expandoFromXml = new List<dynamic>(); var doc = XDocument.Load(file); var nodes = doc.Root.Descendants(descendantid); foreach (var element in doc.Root.Descendants(descendantid)) { dynamic expandoObject = new ExpandoObject(); var dictionary = expandoObject as IDictionary<string, object>; foreach (var child in element.Descendants()) { if (child.Name.Namespace == "") dictionary[child.Name.ToString()] = child.Value.Trim(); } yield return expandoObject; } }

Más enlaces:
http://www.codeproject.com/Tips/227139/Converting-XML-to-an-dynamic-object-using-ExpandoO
http://www.codeproject.com/Articles/461677/Creating-a-dynamic-object-from-XML-using-ExpandoOb