Pregunta

Tengo un poco de XML que deserializar en un objeto de negocio. Estoy usando XmlSerializer.Deserialize para hacerlo. Sin embargo, quiero uno de los XmlElement contenida en el XML quedarse una XElement.

No se puede hacer directamente (usando un XmlElementAttribute) desde XElement no es Serializable. También probé para serializar ese elemento en una cadena (en unos dos pasos intentan obtener una XElement), pero que falló con el error:

  

inesperado elemento de tipo de nodo.   método readelementstring sólo puede ser   pidió a los elementos con simple o   contenido vacío

Cualquier idea de lo que se puede hacer?

Aquí está un ejemplo de XML y el objeto resultante Quiero:

<Person name="Joe">
  <Hobbies>
    <Hobby name="Reading" .../>
    <Hobby name="Photography" .../>
  </Hobbies>
  <HomeAddress>
    ...
  </HomeAddress>
</Person>

Objeto:

 public class Person
    {
      [XmlAttribute("Name")]
      public string Name {get; set;}
      ?????
      public XElement Hobbies {get; set;}
      [XmlElement("HomeAddress")]
      public Address HomeAddress {get; set;}
    }

Los intentos que no funcionan:

[XmlElement("Hobbies")]
public XElement Hobbies {get; set;}
[XmlElement("Hobbies")]
public string Hobbies {get; set;}
¿Fue útil?

Solución

Para evitar el trabajo arduo de implementar algo así como IXmlSerializable, es posible hacer algo a lo largo de las líneas de un paso a través XmlElement propiedad semi-oculta; en cuenta, sin embargo, que esto no acaba de hacer lo que quiera, ya que sólo puede tener un valor XElement raíz (no dos, como por su ejemplo); se necesitaría una lista de tareas que ...

using System;
using System.ComponentModel;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
public class Person
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
    [XmlIgnore]
    public XElement Hobbies { get; set; }

    [XmlElement("Hobbies")]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public XmlElement HobbiesSerialized
    {
        get
        {
            XElement hobbies = Hobbies;
            if(hobbies == null) return null;
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(hobbies.ToString());
            return doc.DocumentElement;
        }
        set
        {
            Hobbies = value == null ? null
                : XElement.Parse(value.OuterXml);
        }
    }
    [XmlElement("HomeAddress")]
    public Address HomeAddress { get; set; }
}

public class Address { }

static class Progmam
{
    static void Main()
    {
        var p = new Person { Hobbies = new XElement("xml", new XAttribute("hi","there")) };
        var ser = new XmlSerializer(p.GetType());
        ser.Serialize(Console.Out, p);
    }
}

Otros consejos

Para tener un control total (junto con plena responsabilidad) sobre cómo se genera el XML puede tener su clase implementa la interfaz System.Xml.Serialization.IXmlSerializable, y anular ReadXml y WriteXml. Yo he tenido que hacer esto antes con clases de diccionario - asegúrese de probar a fondo, sobre todo con propiedades nulos, campos vacíos, etc.

.

http://www.devx.com/dotnet/Article/29720

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top