Frage

ich einige XML haben, dass ich in ein Geschäftsobjekt deserialisieren. Ich verwende XmlSerializer.Deserialize dies zu tun. Allerdings mag ich eine der XmlElement in der XML-enthielt eine XElement zu bleiben.

Es kann nicht direkt erfolgen (unter Verwendung eines XmlElementAttribute) seit XElement nicht Serializable ist. Ich habe auch versucht zu serialize das Element in einen String (in einem zwei Schritten versuchen, eine XElement zu bekommen), aber das mit dem Fehler fehlgeschlagen:

  

unerwartetes Knotentyp-Element.   sein Verfahren readelementstring kann nur   rief Elemente mit einfachen oder   leerer Inhalt

Jede Idee, wie das getan werden kann?

Hier ist ein Beispiel für XML und das resultierende Objekt Ich mag:

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

Objekt:

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

Die Versuche, die keine Arbeit tun:

[XmlElement("Hobbies")]
public XElement Hobbies {get; set;}
[XmlElement("Hobbies")]
public string Hobbies {get; set;}
War es hilfreich?

Lösung

Um die harte Arbeit der Umsetzung etwas wie IXmlSerializable zu vermeiden, könnten Sie etwas entlang der Linien von einem halb versteckt Pass-thru XmlElement Eigenschaft tun; Beachten Sie jedoch, dass dies nicht ganz das tut, was Sie wollen, da Sie nur eine Wurzel XElement Wert haben kann (nicht zwei, wie pro Ihr Beispiel); Sie würde eine Liste brauchen, dass ...

zu tun
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);
    }
}

Andere Tipps

volle Kontrolle haben (zusammen mit voller Verantwortung), wie die XML generiert Sie Ihre Klasse implementieren die System.Xml.Serialization.IXmlSerializable Schnittstelle haben kann, und überschreiben ReadXml und WriteXml. Ich hatte, dies zu tun, bevor sie mit Wörterbuch Klassen -. Sicher sein, gründlich zu testen, vor allem mit null Eigenschaften, leeren Feldern, usw.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top