質問

私は、ビジネス・オブジェクトにデシリアライズするいくつかのXMLを持っています。私はそうするXmlSerializer.Deserializeを使用しています。しかし、私はXMLに含まれているのXmlElementの一つは、XElementの滞在したい。

XElementがシリアライズないので

これは(XmlElementAttributeを使用して)直接実行することはできません。私はまた、(2つの工程での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財産の線に沿って何かをするかもしれません。ただし、あなただけ(あなたの例のようではない2)1つのルート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帰属
所属していません StackOverflow
scroll top