Как спроектировать и украсить класс (ы), чтобы я мог десериализовать следующий XML?

Я хочу десериализовать следующий XML в пользовательский класс:

<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
<channel>
 <title>test</title>
 <description>test</description>
 <language>nl</language>
 <link>http://www.test.test</link>
 <item>
  <link>http://www.testlink1</link>
  <pubDate>Di, 03 Nov 2015 09:08:44 +0100</pubDate>
  <sector>
   <entry>a:b</entry>
   <entry>a:c</entry>
   <entry>a:d</entry>
   <entry>a:b</entry>
  </sector>
  <title>test</title>
  <lead><![CDATA[test]]></lead>
  <description><![CDATA[test ]]></description>
  <images>
   <enclosure url="http://test.dll?tem=LTO_IMAGE_DOC&amp;size=1024&amp;doc_id=100782" length="608055" type="image/jpg"/>
  </images>
 </item>
</channel>
</rss>

Вот мой класс:

    [Serializable]
    [XmlRoot("item", IsNullable = false)]
    public class CustomRssItem : BaseRssItem
    {
        [XmlElement("publisher", Namespace = "http://purl.org/dc/elements/1.1/")]
        public string Author { get; set; }

        [XmlElement("guid", Namespace = "")]
        public string Guid { get; set; }

        [XmlArray("sector")]
        [XmlArrayItem("entry")]
        public List<string> Sector { get; set; }

    }

Как я могу изменить свой класс, чтобы использовать собственный класс вместо List<string> так что я могу заключить в синтаксический анализ, что мне нужно сделать на элементе ввода (разделение строки против двоеточия)?

Вместо List<string> Сектор я хочу написать List<GroupEntry> Сектор, где GroupEntry будет моим пользовательским классом, содержащим значение "a:b", которое я могу анализировать и выставлять новые свойства, такие как Group и Subgroup?

2 ответа

Решение

Реализуя класс GroupEntry с правильными атрибутами XmlSerialization, мы можем достичь этой цели.

Класс будет иметь поля a и b, но вы не хотите, чтобы они были сериализованы, поэтому мы игнорируем их во время сериализации, используя атрибут XmlIgnore

Затем у нас есть поле ab, которое мы хотим сериализовать как текст элемента. Мы осуществляем это, используя атрибут XmlText.

Мы реализуем не только метод get, но также метод set для ab, потому что этот метод вызова будет вызываться XmlSerialization при десериализации экземпляра этого типа из xml.

Вот необходимый код класса GroupEntry:

public class GroupEntry
{
    [System.Xml.Serialization.XmlIgnore]
    public string a;
    [System.Xml.Serialization.XmlIgnore]
    public string b;

    [System.Xml.Serialization.XmlText]
    public string ab
    {
        get
        {
            return string.Format("{0}:{1}", a, b);
        }
        set
        {
            a = null;
            b = null;
            if (value != null)
            {
                string[] split = value.Split(':');
                a = split[0];
                if (split.Length > 1)
                {
                    b = split[1];
                }
            }
        }
    }
}

Это то, что я хотел бы предложить

  1. Создать XSD из файла XML XML в XSD
  2. Из XSD создать класс для него XSD в CS

И ниже сгенерированный класс, теперь на основе этого класса вы можете настроить свой класс или использовать следующий класс как есть. Вы также можете переименовать свойства и настроить все имена, украсив их соответствующими атрибутами.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=4.6.81.0.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class rss {

    private rssChannel channelField;

    private decimal versionField;

    /// <remarks/>
    public rssChannel channel {
        get {
            return this.channelField;
        }
        set {
            this.channelField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal version {
        get {
            return this.versionField;
        }
        set {
            this.versionField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rssChannel {

    private string titleField;

    private string descriptionField;

    private string languageField;

    private string linkField;

    private rssChannelItem itemField;

    /// <remarks/>
    public string title {
        get {
            return this.titleField;
        }
        set {
            this.titleField = value;
        }
    }

    /// <remarks/>
    public string description {
        get {
            return this.descriptionField;
        }
        set {
            this.descriptionField = value;
        }
    }

    /// <remarks/>
    public string language {
        get {
            return this.languageField;
        }
        set {
            this.languageField = value;
        }
    }

    /// <remarks/>
    public string link {
        get {
            return this.linkField;
        }
        set {
            this.linkField = value;
        }
    }

    /// <remarks/>
    public rssChannelItem item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rssChannelItem {

    private string linkField;

    private string pubDateField;

    private string[] sectorField;

    private string titleField;

    private string leadField;

    private string descriptionField;

    private rssChannelItemImages imagesField;

    /// <remarks/>
    public string link {
        get {
            return this.linkField;
        }
        set {
            this.linkField = value;
        }
    }

    /// <remarks/>
    public string pubDate {
        get {
            return this.pubDateField;
        }
        set {
            this.pubDateField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("entry", IsNullable=false)]
    public string[] sector {
        get {
            return this.sectorField;
        }
        set {
            this.sectorField = value;
        }
    }

    /// <remarks/>
    public string title {
        get {
            return this.titleField;
        }
        set {
            this.titleField = value;
        }
    }

    /// <remarks/>
    public string lead {
        get {
            return this.leadField;
        }
        set {
            this.leadField = value;
        }
    }

    /// <remarks/>
    public string description {
        get {
            return this.descriptionField;
        }
        set {
            this.descriptionField = value;
        }
    }

    /// <remarks/>
    public rssChannelItemImages images {
        get {
            return this.imagesField;
        }
        set {
            this.imagesField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rssChannelItemImages {

    private rssChannelItemImagesEnclosure enclosureField;

    /// <remarks/>
    public rssChannelItemImagesEnclosure enclosure {
        get {
            return this.enclosureField;
        }
        set {
            this.enclosureField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rssChannelItemImagesEnclosure {

    private string urlField;

    private uint lengthField;

    private string typeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string url {
        get {
            return this.urlField;
        }
        set {
            this.urlField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public uint length {
        get {
            return this.lengthField;
        }
        set {
            this.lengthField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type {
        get {
            return this.typeField;
        }
        set {
            this.typeField = value;
        }
    }
}
Другие вопросы по тегам