2008-10-22 70 views
51

así que tengo XML que tiene este aspecto: deserializar XML a objetos en C#

<todo-list> 
    <id type="integer">#{id}</id> 
    <name>#{name}</name> 
    <description>#{description}</description> 
    <project-id type="integer">#{project_id}</project-id> 
    <milestone-id type="integer">#{milestone_id}</milestone-id> 
    <position type="integer">#{position}</position> 

    <!-- if user can see private lists --> 
    <private type="boolean">#{private}</private> 

    <!-- if the account supports time tracking --> 
    <tracked type="boolean">#{tracked}</tracked> 

    <!-- if todo-items are included in the response --> 
    <todo-items type="array"> 
    <todo-item> 
     ... 
    </todo-item> 
    <todo-item> 
     ... 
    </todo-item> 
    ... 
    </todo-items> 
</todo-list> 

¿cómo iba a ir sobre el uso de la biblioteca de serialización de .NET deserializar esto en objetos de C#?

Actualmente estoy usando la reflexión y hago un mapa entre el xml y mis objetos utilizando las convenciones de nomenclatura.

Respuesta

57

Cree una clase para cada elemento que tenga una propiedad para cada elemento y una Lista o matriz de objetos (use la creada) para cada elemento secundario. Luego llame a System.Xml.Serialization.XmlSerializer.Deserialize en la cadena y eche el resultado como su objeto. Use los atributos System.Xml.Serialization para realizar ajustes, como asignar el elemento a su clase ToDoList, use el atributo XmlElement ("todo-list").

Un shourtcut es cargar su XML en Visual Studio, haga clic en el botón "Inferir esquema" y ejecute "xsd.exe/c schema.xsd" para generar las clases. xsd.exe está en la carpeta de herramientas. A continuación, revise el código generado y haga los ajustes necesarios, como cambiar de pantalón corto a blanco.

+2

En VS2010 se llama 'Crear esquema' y puede generar múltiples archivos xsd (uno por espacio de nombres). En ese caso, incluya aquellos en el comando, es decir, ejecute "xsd.exe/c schema.xsd schema1.xsd" (etc.). –

+5

En VS 2012 y posterior, también tiene "Pegar XML como clases" en el menú Edición. –

+4

'Edición> Pegar especial> Pegar XML como clases' Muy agradable, @JonathanAllen, exactamente lo que necesitaba. – JMD

31

se reduce a la utilización de herramientas de xsd.exe en VS:

xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%" 

luego cargarla con el lector y deserializer:

public GeneratedClassFromXSD GetObjectFromXML() 
{ 
    var settings = new XmlReaderSettings(); 
    var obj = new GeneratedClassFromXSD(); 
    var reader = XmlReader.Create(urlToService, settings); 
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(GeneratedClassFromXSD)); 
    obj = (GeneratedClassFromXSD)serializer.Deserialize(reader); 

    reader.Close(); 
    return obj; 
} 
+1

+1 buen enlace, guardado muchas líneas de código –

+1

Hmmm, en el ejemplo Supongo que la variable 'urlToService' representa el XML serializado? ¿Y debería esa variable ser un argumento para 'GetObjectFromXML()'? – DavidRR

3

Hay un par de opciones diferentes.

  • Visual Studio incluye un programa de línea de comandos llamado xsd.exe. Usted usa ese programa para crear un documento de esquema y usa el programa nuevamente en el documento de esquema para crear clases que puede usar con system.xml.serialization.xmlserializer
  • . Es posible que solo pueda llamar a Dataset.ReadXml() en él.
4

Bueno, tendría que tener clases en su conjunto que coincida, más o menos, con el XML (propiedad llamada Private, una propiedad de colección llamada ToDo, etc.).

El problema es que el XML tiene elementos que no son válidos para los nombres de clase. Por lo tanto, debe implementar IXmlSerializable en estas clases para controlar cómo se serializan desde y hacia XML. También puede salirse con la suya usando algunos de los atributos específicos de serialización xml, pero eso depende del esquema de su xml.

Eso es un paso más arriba usando el reflejo, pero puede que no sea exactamente lo que estás esperando.

4

Pedido http://xsd2code.codeplex.com/

Xsd2Code CSharp es un generador o clase de Visual Basic de negocios Entidad de esquema XSD.

+0

@Deepfreezed: por favor, den más detalles. ¿Cómo resolvería esto el problema en esta pregunta? Tal vez muestre un ejemplo de código de uso de la herramienta. –

+0

Primero genere el esquema XSD para XML usando VS. Luego ejecuté la herramienta de generación de código anterior. Esto generó una clase/objeto que puedo usar para serializar el XML. Esta herramienta se integra con VS 2008/2010. También tiene algunas características agradables como colecciones genéricas. – Deepfreezed

14

deserializar cualquier objeto, siempre y cuando el tipo T está marcado Serializable:

function T Deserialize<T>(string serializedResults) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    using (var stringReader = new StringReader(serializedResults)) 
     return (T)serializer.Deserialize(stringReader); 
} 
+0

En lugar de 'Deserialize (string s)', ¿quiso decir 'Deserialize (string serializedResults)'? – DavidRR

+0

Solucionado. ¡Gracias @DavidRR! – Keith

-1

tuve la misma pregunta hace unos años que la forma en ABT mapeo XML a clases de C# o la creación de clases de C# que se asigna a nuestra XMLs, jst como hacemos en el Framework de la entidad (asignamos tablas a clases C#). Creé un framework finalmente, que puede crear clases C# a partir de su XML y estas clases se pueden utilizar para leer/escribir su xml. Tener un look

Cuestiones relacionadas