gpt4 book ai didi

c# - 将 XML 节点反序列化为从属性获取值的集合

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:46 30 4
gpt4 key购买 nike

如果我有这样的xml

        <SiteSettings>              
<sortOptions>
<add name="By Date" value="date" />
<add name="By Rating" value="rating" />
</sortOptions>
</SiteSettings>

我想将其反序列化为这样的对象

[XmlRoot("SiteSettings")]
public class SerializableSiteSettings
{
public List<NameValuePair> SortOptions { get; set; }
}

public class NameValuePair
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("value")]
public object Value { get; set; }
}

我尝试将其添加到 SortOptions,但没有成功

    [XmlArrayItem("actionButtons", typeof(List<NameValuePair>))]
public List<NameValuePair> ActionButtons { get; set; }

最佳答案

您对 XmlSerializer 的使用存在一些问题:

  1. XmlSerializer needs to know the types to expect when (de)serializing.当你有一个像 public object Value { get; 这样的字段时放; } 它不知道如何反序列化该字段或在其中期望什么。您需要告诉它该信息——但是因为 Valueattribute这表明该字段很简单,例如字符串。因此,我将在这个答案中假设一个字符串足以保存此信息。

  2. 您需要告诉 XmlSerializer 您名为 SortOptions 的属性将使用名称 sortOptions 而不是 进行序列化SortOptions,使用 XmlArray属性。

  3. 您需要使用 XmlArrayItem 告诉 XmlSerializer add 是每个数组元素的名称属性。

因此,以下工作并将 Value 读入字符串:

[XmlRoot("SiteSettings")]
public class SerializableSiteSettings
{
[XmlArray("sortOptions")]
[XmlArrayItem("add", typeof(NameValuePair))]
public List<NameValuePair> SortOptions { get; set; }
}

public class NameValuePair
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("value")]
public string Value { get; set; }
}

如果 Value 不是字符串,而是某种多态类型,您可能需要为 NameValuePair 实现 IXmlSerializable,如下所示以下之一:.NET XmlSerializer: polymorphic mapping based on attribute value .

关于c# - 将 XML 节点反序列化为从属性获取值的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26922696/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com