Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用可变密钥解析xml_C#_Wpf_Windows Phone 8_Xml Parsing_Linq To Xml - Fatal编程技术网

C# 使用可变密钥解析xml

C# 使用可变密钥解析xml,c#,wpf,windows-phone-8,xml-parsing,linq-to-xml,C#,Wpf,Windows Phone 8,Xml Parsing,Linq To Xml,我正在尝试解析以下XML: <plist version="1.0"> <array> <dict> <key>SubTitle</key> <array> <dict> <key>Values</key> <array>

我正在尝试解析以下XML:

<plist version="1.0">
<array>
    <dict>
        <key>SubTitle</key>
        <array>
            <dict>
                <key>Values</key>
                <array>
                    <string>D1</string>
                    <string>D2</string>
                </array>
                <key>Title</key>
                <string>Chapter One</string>
                <key>supportsEdit</key>
                <true/>
            </dict>
            <dict>
                <key>Values</key>
                <array>
                    <string>DC1</string>
                    <string>DC2</string>
                </array>
                <key>Title</key>
                <string>Chapter Two</string>
                <key>supportsEdit</key>
                <true/>
            </dict>
        </array>
        <key>MainTitle</key>
        <string>Science</string>
    </dict>
    <dict>
        <key>SubTitle</key>
        <array>
            <dict>
                <key>Values</key>
                <array>
                    <string>CD1</string>
                    <string>CD2</string>
                </array>
                <key>Title</key>
                <string>Chapter One</string>
                <key>supportsEdit</key>
                <true/>
            </dict>
            <dict>
                <key>Values</key>
                <array>
                    <string>DDC1</string>
                    <string>DDC2</string>
                </array>
                <key>Title</key>
                <string>Chapter Two</string>
                <key>supportsEdit</key>
                <true/>
            </dict>
        </array>
        <key>MainTitle</key>
        <string>Physics</string>
    </dict>

    /// here is where i get the error
    <dict>
        <key>Values</key>
        <array>
                            <string>CD1</string>
                <string>CD2</string>
                            <string>DDC1</string>
            <string>DDC2</string>
                            <string>DC1</string>
                        <string>DC2</string>
        </array>
        <key>Title</key>
        <string>Random Values</string>
        <key>supportsEdit</key>
        <true/>
    </dict>

出于调试目的,我将您的集合分为两个步骤:

        var first = doc
            .Root
            .Element("array")
            .Elements("dict")
            .Select(GetValues);

       var plistData = first
            .ToDictionary(
                v => v.ContainsKey("MainTitle")?
                        (string) v["MainTitle"]:
                        (string) v["Title"],
                 v => (v.ContainsKey("SubTitle")?
                        v["SubTitle"]
                        .Elements("dict")
                        .Select(ParseMyObject) :
                        ParseMyString(v["Values"])
                        )
                        .ToList());
最后一个plist结构的辅助对象
静态列表ParseMyString(XElement dict)
{
返回新列表
{
新篇章
{
Title=“某些值”,
FileNames=dict.Elements().Select(s=>(string)s.ToList()
}
};
} 

我在创建dictionary元素时添加了一个检查,以确定键MainTitle是否确实存在。如果没有,我会添加一个默认键。同样的机制也适用于字幕,如果字幕不存在,则会提供一个空值。

请花时间仔细解释您试图做的事情以及出现的问题。到目前为止,你的问题似乎有点不清楚,我真的不明白。@Sheridan,你能邀请我到聊天室吗?我可以解释一下you@Sheridan你能加入我们吗?我的请求是为了帮助任何人回答你的问题,而不仅仅是我。因此,你能把你所有的相关信息添加到你的问题中,让每个人都能看到吗?@Sheridan是的,你是对的,我已经添加了我所有的信息,如果有任何具体的信息,请询问,我不能提供完整的代码。基于你含糊不清的问题,我修正了我认为错误的地方。用我的代码替换代码中的几行并不难。请改为问一个新问题,但请记住,我们不是来做您的工作的。我对上述评论感到抱歉,如果没有主标题,我希望标题和主标题为
随机值
我们可以修改吗?另外,
随机值
应该包含
在最后一个问题中,我正在尝试打印我能够得到
物理和科学的
第一章和第二章
的值,但是我如何打印
随机值
CD1,CD2,DDC1,DDC2,DC1和DC2
?您能帮我一下吗
foreach (var value in plistData)
{
    topicList.Add(value.Key);
    Debug.WriteLine(" Main title is "+value.Key);
    if (!value.Key.Equals("Random Values"))
    {
        List<Topic> listOfSubTopics = plistData[value.Key];
        for (int j = 0; j < listOfSubTopics.Count; j++)
        {
            Debug.WriteLine("sub title " + listOfSubTopics[j].Title);
            for (int i = 0; i < listOfSubTopics[j].FileNames.Count; i++)
            {
                Debug.WriteLine("Values is" + listOfSubTopics[j].FileNames[i]);
            }
        }
    }
    else
    {
       // here i want to print values of Random Values
    }
        var first = doc
            .Root
            .Element("array")
            .Elements("dict")
            .Select(GetValues);

       var plistData = first
            .ToDictionary(
                v => v.ContainsKey("MainTitle")?
                        (string) v["MainTitle"]:
                        (string) v["Title"],
                 v => (v.ContainsKey("SubTitle")?
                        v["SubTitle"]
                        .Elements("dict")
                        .Select(ParseMyObject) :
                        ParseMyString(v["Values"])
                        )
                        .ToList());
    static List<Chapter> ParseMyString(XElement dict)
    {

        return new List<Chapter>
            {
                new Chapter
                    {
                        Title = "some values",
                        FileNames = dict.Elements().Select(s => (string) s).ToList()
                    }
            };
    }