3

我有一些可反序列化为业务对象的 XML。我正在使用 XmlSerializer.Deserialize 这样做。但是,我希望 XML 中包含的 XmlElement 之一保持 XElement。

它不能直接完成(使用 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;}
4

2 回答 2

3

为了避免实现类似 的繁重工作IXmlSerializable,您可能会按照半隐藏的 pass-thruXmlElement属性做一些事情;但是请注意,这并不完全符合您的要求,因为您只能有一个根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);
    }
}
于 2010-01-14T05:03:56.283 回答
1

要完全控制(以及全部责任)如何生成 XML,您可以让您的类实现 System.Xml.Serialization.IXmlSerializable 接口,并覆盖 ReadXml 和 WriteXml。我以前必须用字典类来做这件事——一定要彻底测试,尤其是空属性、空字段等。

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

于 2010-01-14T03:38:51.210 回答