C# 解析具有相同键值的Xml

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

我正在开发Windows Phone 8应用程序

我有一些UI,看起来像这样:

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");