C# 解析具有相同键值的Xml
我正在开发Windows Phone 8应用程序 我有一些UI,看起来像这样:C# 解析具有相同键值的Xml,c#,wpf,windows-phone-8,xml-parsing,linq-to-xml,C#,Wpf,Windows Phone 8,Xml Parsing,Linq To Xml,我正在开发Windows Phone 8应用程序 我有一些UI,看起来像这样: Dictionary<string, List<Tricks>> plistData = doc.Root.Element("dict").Element("array").Elements("dict") .Select(GetValues) .ToDict
Dictionary<string, List<Tricks>> plistData =
doc.Root.Element("dict").Element("array").Elements("dict")
.Select(GetValues)
.ToDictionary(v => (string)v["Name"],
v => v["SubItems"]
.Elements("dict").Select(Parse).ToList());
static Tricks Parse(XElement dict)
{
var values = GetValues(dict);
return new Tricks
{
SubTitle = (string)values["Name"],
SubTitleDescription = (string)values["Description"]
};
}
static Dictionary<string, XElement> GetValues(XElement dict)
{
return dict.Elements("key")
.ToDictionary(k => (string)k, k => (XElement)k.NextNode);
}
主项A---以其描述和子项列表作为键值
主项B---其描述和子项列表作为键值
主项C---其描述和子项列表作为键值
现在,单击“移动到下一页”,该页将显示其说明及其子项
单击主项目A
主要项目A的说明
子项1---点击此按钮,显示其说明
子项2---点击此按钮,显示其说明
以下是Xml的外观:
类别
名称
A.
描述
一些数据
子项目
描述
一些数据
名称
一个
名称
两个
描述
一些数据
名称
B
描述
一些数据
子项目
描述
一些数据
名称
一个
名称
两个
描述
一些数据
如何解析这个例子
更新
我是这样解决的:
Dictionary<string, List<Tricks>> plistData =
doc.Root.Element("dict").Element("array").Elements("dict")
.Select(GetValues)
.ToDictionary(v => (string)v["Name"],
v => v["SubItems"]
.Elements("dict").Select(Parse).ToList());
static Tricks Parse(XElement dict)
{
var values = GetValues(dict);
return new Tricks
{
SubTitle = (string)values["Name"],
SubTitleDescription = (string)values["Description"]
};
}
static Dictionary<string, XElement> GetValues(XElement dict)
{
return dict.Elements("key")
.ToDictionary(k => (string)k, k => (XElement)k.NextNode);
}
字典plistData=
doc.Root.Element(“dict”).Element(“数组”).Elements(“dict”)
.选择(获取值)
.ToDictionary(v=>(字符串)v[“名称”],
v=>v[“子项”]
.Elements(“dict”).Select(Parse.ToList());
静态技巧解析(XElement dict)
{
var值=GetValues(dict);
回归新把戏
{
副标题=(字符串)值[“名称”],
字幕说明=(字符串)值[“说明”]
};
}
静态字典GetValues(XElement dict)
{
返回dict.Elements(“键”)
.ToDictionary(k=>(字符串)k,k=>(XElement)k.NextNode);
}
在上面的示例中,除了主标题说明之外,我可以得到所有信息。您正在试图在一个数据模型中压缩3条信息(名称、说明和子项列表),该数据模型只能容纳两个项(一个键和一个值) 我提供两种解决方案。一种是“修复”代码中的问题,另一种是更灵活的解决方案。随便挑一个你喜欢的 快速修复 最大的变化是字典不再返回字符串,而是返回一个完整的
Tricks
对象
public Dictionary<Tricks, List<Tricks>> Clumsy(XDocument doc)
{
var plistData =
doc
.Root
.Element("dict")
.Element("array")
.Elements("dict")
.Select( ele => new
{
key = Parse(ele),
val = ele.Element("array")
.Elements("dict")
.Select(Parse).ToList()
}).ToDictionary(pair => pair.key,
pair => pair.val);
return plistData;
}
static Tricks Parse(XElement dict)
{
var values = GetValues(dict);
return new Tricks
{
SubTitle = (string)values["Name"],
SubTitleDescription = (string)values["Description"]
};
}
static Dictionary<string, XElement> GetValues(XElement dict)
{
return dict.Elements("key")
.ToDictionary(k => (string)k, k => (XElement)k.NextNode);
}
类模型
公共类菜单
{
公共列表类别{get;set;}
}
公开课技巧
{
[XmlElementAttribute(“名称”)]
公共字符串字幕{get;set;}
[XmlElementAttribute(“说明”)]
公共字符串描述{get;set;}
公共列表子项{get;set;}
}
用法
var parser=new PListParser();
var menu=parser.Deserialize(@“c:\my\path\to\the\plist.xml”);
因此,在您的示例中,我所称的菜单现在称为技巧。什么是主标题?不,不,我的意思是你能帮我解决我的问题吗?这里:说出一个描述一些我需要的数据description@user3114009我为您的问题添加了修复程序。
public class MenuRoot
{
public List<Tricks> Category { get; set; }
}
public class Tricks
{
[XmlElementAttribute("Name")]
public string SubTitle { get; set; }
[XmlElementAttribute("Description")]
public string SubTitleDescription { get; set; }
public List<Tricks> SubItems { get; set; }
}
var parser = new PListParser();
var menu = parser.Deserialize<MenuRoot>(@"c:\my\path\to\the\plist.xml");