我有一些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控制(连同全部责任)。我已经与字典上课前要做到这一点 - 一定要彻底的测试,尤其是空的属性,空字段等

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top