Teilweise deserialisiert XML Object
-
20-09-2019 - |
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;}
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 ...
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.