您好我有以下Xml反序列化:
<RootNode>
<Item
Name="Bill"
Age="34"
Job="Lorry Driver"
Married="Yes" />
<Item
FavouriteColour="Blue"
Age="12"
<Item
Job="Librarian"
/>
</RootNote>
当我不知道密钥名称或将有多少属性时,如何使用属性键值对列表反序列化Item元素?
答案 0 :(得分:1)
您可以使用XmlAnyAttribute
属性指定在使用XmlSerializer
时将任意属性序列化并反序列化为XmlAttribute []
属性或字段。
例如,如果您想将属性表示为Dictionary<string, string>
,则可以使用代理Item
属性定义RootNode
和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; }
}
原型fiddle。
答案 1 :(得分:0)
您是否反序列化为对象列表? 你可以参考以下帖子,它对我有用
答案 2 :(得分:0)
使用XmlDocument
课程,您只需选择&#34;项目&#34;节点并遍历属性:
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列表的对象,你可以使用类似的东西:
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()
};