سؤال

ولدي بعض XML أنني إلغاء تسلسل إلى كائن الأعمال. أنا أستخدم XmlSerializer.Deserialize للقيام بذلك. ومع ذلك، أريد واحدة من XmlElement الواردة في XML البقاء على XElement.

وولا يمكن القيام به مباشرة (باستخدام XmlElementAttribute) منذ XElement ليس للتسلسل. كما أنني حاولت إجراء تسلسل هذا العنصر إلى سلسلة (في خطوتين محاولة للحصول على XElement)، ولكن التي فشلت مع الخطأ:

<اقتباس فقرة>   

وغير متوقع العنصر نوع العقدة.   يمكن readelementstring طريقة تكون فقط   دعا العناصر مع بسيطة أو   محتوى فارغ

وأي فكرة كيف يمكن القيام به؟

وهنا مثال من أكس والكائن الناتجة أريد:

<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