题
我有一些XML,我反序列化为业务对象。我使用XmlSerializer.Deserialize这样做。但是,我想包含在XML留一个的XElement所述的XmlElement之一。
它不能直接(使用XmlElementAttribute)完成,因为的XElement无法序列化。我还试图该元素序列化到一个字符串(在两个步骤试图得到一个的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
的辛勤工作,你可能会做的线沿线的东西半隐藏直通XmlElement
财产;但是请注意,这不挺你想,因为你只能有一个根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控制(连同全部责任)。我已经与字典上课前要做到这一点 - 一定要彻底的测试,尤其是空的属性,空字段等
。不隶属于 StackOverflow