有一个类提供默认的XmlElementName

时间:2014-08-18 19:51:06

标签: c# xml xml-serialization

我正在尝试序列化的一组类作为此规范的一部分:http://open511.org/root.html

public class Link
{
    public Link()
    {

    }

    public Link(string url, string rel = "self")
    {
        Url = url;
        Rel = rel;
    }

    [XmlAttribute("rel")]
    public string Rel { get; set; }

    [XmlAttribute("href")]
    public string Url { get; set; }
}

public class Service
{
    private Link _serviceTypeUrl;

    [XmlElement("link")]
    public Link ServiceTypeUrl
    {
        get { return _serviceTypeUrl; }
        set
        {
            _serviceTypeUrl = value;
            _serviceTypeUrl.Rel = "service_type";
        }
    }

    [XmlElement("link")]
    public Link Url { get; set; }

    [XmlArray("supported_versions")]
    [XmlArrayItem("supported_version")]
    public List<SupportedVersion> SupportedVersions { get; set; }
}

它不会让我有两个具有相同XMLElement的属性。有没有办法做到这一点?

我本来希望让链接类指定始终使用元素名称“link”

2 个答案:

答案 0 :(得分:0)

看起来你想要实现的目标不受支持。您的替代方案是:

  1. 使用不同的元素名称来序列化您的属性
  2. 使用集合来保存所有Link个。这使得查询数据变得困难 在某些情况下,但我相信会给你类似你想要的东西。
  3. <强>来源

答案 1 :(得分:0)

受FreeAsInBeer的回答启发,我将它们存储在一个列表中,并编写了一个自定义插入内容以防止重复插入。

public class Service
{
    private List<Link> _links;

    [XmlIgnore]
    public Link ServiceTypeUrl
    {
        get { return Links.FirstOrDefault(l => l.Rel == "service_type"); }
        set
        {
            var tempLink = value;
            tempLink.Rel = "service_type";
            Links.RemoveAll(l => l.Rel == tempLink.Rel); // prevent duplicate rel
            Links.Add(tempLink);
        }
    }

    [XmlIgnore]
    public Link Url
    {
        get { return Links.FirstOrDefault(l => l.Rel == "self"); }
        set
        {
            var tempLink = value;
            tempLink.Rel = "self";
            Links.RemoveAll(l => l.Rel == tempLink.Rel); // prevent duplicate rel
            Links.Add(tempLink);
        }
    }

    [XmlElement("link")]
    public List<Link> Links
    {
        get { return _links ?? (_links = new List<Link>()); }
        set { _links = value; }
    }

    [XmlArray("supported_versions")]
    [XmlArrayItem("supported_version")]
    public List<SupportedVersion> SupportedVersions { get; set; }
}