如何在C#中反序列化具有属性列表的元素

本文关键字:属性 列表 元素 反序列化 | 更新日期: 2023-09-27 18:15:22

Hi我有以下Xml要反序列化:

<RootNode>
    <Item
      Name="Bill"
      Age="34"
      Job="Lorry Driver"
      Married="Yes" />
    <Item
      FavouriteColour="Blue"
      Age="12"
    <Item
      Job="Librarian"
       />
    </RootNote>

当我不知道关键字名称或将有多少个属性时,如何使用属性-关键字-值对列表来反序列化Item元素?

如何在C#中反序列化具有属性列表的元素

使用XmlSerializer时,可以使用XmlAnyAttribute属性指定将任意属性序列化并反序列化为XmlAttribute []属性或字段。

例如,如果您想将属性表示为Dictionary<string, string>,您可以如下定义ItemRootNode类,使用代理XmlAttribute[]属性将字典从和转换为所需的XmlAttribute数组:

public class Item
{
    [XmlIgnore]
    public Dictionary<string, string> Attributes { get; set; }
    [XmlAnyAttribute]
    public XmlAttribute[] XmlAttributes
    {
        get
        {
            if (Attributes == null)
                return null;
            var doc = new XmlDocument();
            return Attributes.Select(p => { var a = doc.CreateAttribute(p.Key); a.Value = p.Value; return a; }).ToArray();
        }
        set
        {
            if (value == null)
                Attributes = null;
            else
                Attributes = value.ToDictionary(a => a.Name, a => a.Value);
        }
    }
}
public class RootNode
{
    [XmlElement("Item")]
    public List<Item> Items { get; set; }
}

小提琴原型。

使用XmlDocument类,您只需选择"Item"节点并迭代属性:

string myXml = "<RootNode><Item Name='"Bill'" Age='"34'" Job='"Lorry Driver'" Married='"Yes'" /><Item FavouriteColour='"Blue'" Age='"12'" /><Item Job='"Librarian'" /></RootNode>"
XmlDocument doc = new XmlDocument();
doc.LoadXml(myXml);
XmlNodeList itemNodes = doc.SelectNodes("RootNode/Item");
foreach(XmlNode node in itemNodes)
{
    XmlAttributeCollection attributes = node.Attributes;
    foreach(XmlAttribute attr in attributes)
    {
         // Do something...
    }
}

或者,如果你想要一个只包含KeyValuePairs列表中的Attributes的对象,你可以使用类似的东西:

var items = from XmlNode node in itemNodes
            select new 
            {
                Attributes = (from XmlAttribute attr in node.Attributes
                              select new KeyValuePair<string, string>(attr.Name, attr.Value)).ToList()
            };