[英]Partially deserialize XML to Object
我有一些XML,我將其反序列化為業務對象。 我正在使用XmlSerializer.Deserialize這樣做。 但是,我希望XML中包含的一個XmlElement保留一個XElement。
它不能直接完成(使用XmlElementAttribute),因為XElement不是Serializable。 我還嘗試將該元素序列化為一個字符串(兩步嘗試獲取一個XElement),但失敗並出現錯誤:
意外的節點類型元素。 readelementstring方法只能在具有簡單或空內容的元素上調用
知道如何做到這一點?
這是一個xml的例子和我想要的結果對象:
<Person name="Joe">
<Hobbies>
<Hobby name="Reading" .../>
<Hobby name="Photography" .../>
</Hobbies>
<HomeAddress>
...
</HomeAddress>
</Person>
賓語:
public class Person
{
[XmlAttribute("Name")]
public string Name {get; set;}
?????
public XElement Hobbies {get; set;}
[XmlElement("HomeAddress")]
public Address HomeAddress {get; set;}
}
嘗試不起作用:
[XmlElement("Hobbies")]
public XElement Hobbies {get; set;}
[XmlElement("Hobbies")]
public string Hobbies {get; set;}
為了避免實現像IXmlSerializable
這樣的東西,你可能會做一些半隱藏的pass-thru XmlElement
屬性。 但請注意,由於您只能擁有一個根XElement
值(而不是兩個,根據您的示例),因此您不能完全按照自己的意願XElement
; 你需要一個清單才能做到這一點......
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);
}
}
要對XML的生成方式進行完全控制(以及完全的責任),您可以讓您的類實現System.Xml.Serialization.IXmlSerializable接口,並覆蓋ReadXml和WriteXml。 我必須在使用字典類之前執行此操作 - 確保徹底測試,尤其是使用null屬性,空字段等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.