簡體   English   中英

將XML部分反序列化為Object

[英]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屬性,空字段等。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM