C# 使用可变密钥解析xml
我正在尝试解析以下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>
<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()
}
};
}