我正在开发Windows Phone 8应用程序。
我有一个像下面这样的xml:
<array>
<dict>
<key>SubTopics</key>
<array>
<dict>
<key>ID</key>
<array>
<string>CD1</string>
<string>CD2</string>
<string>CD3</string>
<string>CD4</string>
</array>
<key>Title</key>
<string>Miscellaneous</string>
<key>Desc</key>
<string> this is just a text</string>
<key>HasItems</key>
<true/>
</dict>
<dict>
<key>ID</key>
<array>
<string>DDC1</string>
<string>DDC2</string>
<string>DDC3</string>
<string>DDC4</string>
<string>DDC5</string>
</array>
<key>Title</key>
<string>Miscellaneous One</string>
<key>Desc</key>
<string> this is just a text</string>
<key>HasItems</key>
<true/>
</dict>
</array>
<key>MainTitle</key>
<string>Data</string>
</dict>
<dict>
<key>SubTopics</key>
<array>
<dict>
<key>ID</key>
<array>
<string>SSD1</string>
<string>SS2</string>
<string>SS3</string>
<string>SS4</string>
</array>
<key>Title</key>
<string>Goblins</string>
<key>Desc</key>
<string> this is just a text</string>
<key>HasItems</key>
<true/>
</dict>
<dict>
<key>ID</key>
<array>
<string>ADC1</string>
<string>ADC2</string>
<string>ADC3</string>
<string>ADC4</string>
<string>DDC5</string>
</array>
<key>Title</key>
<string>Tracks</string>
<key>Desc</key>
<string> this is just a text</string>
<key>HasItems</key>
<true/>
</dict>
</array>
<key>MainTitle</key>
<string>Data Two</string>
</dict>
</array>
如何解析这个?
就像这样:
MainTitle
--SubTitle // list of title
---ID
---Desc
---Boolean Value
MainTitle
--SubTitle //list of values
---ID
---Desc
---Boolean Value
现在在第一个屏幕中,我显示所有主要标题
现在点击第一个屏幕中的主要图块,我需要该主标题的所有值。
那我怎样才能存储这些Dictionary<string, List<MyObject>>
?
修改
我试过这个:
var dict = (from plist in doc.Root.Element("array").Elements("dict")
select new MyObject
{
MainTitle = (string)plist.Element("string"),
ListOfSubTitles = plist.Element("array")
.Elements("dict")
.Elements("string")
.Select(s => (string)s)
.ToList(),
})
.ToDictionary(a => a.MainTitle, a => a.ListOfSubTitles);
但是这里它也在ListOfSubTitles
答案 0 :(得分:1)
我建议使用辅助方法。第一个是从您的奇怪的xml数据格式创建值的字典(它使用key
元素值作为字典条目键,下一个节点作为字典条目值):
static Dictionary<string, XElement> GetValues(XElement dict)
{
return dict.Elements("key")
.ToDictionary(k => (string)k, k => (XElement)k.NextNode);
}
第二个是解析MyObject
:
static MyObject ParseMyObject(XElement dict)
{
var values = GetValues(dict);
return new MyObject
{
MainTitle = (string)values["Title"],
ListOfSubTitles = values["ID"].Elements().Select(s => (string)s).ToList()
};
}
所有解析都将如下所示:
XDocument xdoc = XDocument.Load(path_to_xml);
var result =
xdoc.Root.Elements("dict")
.Select(GetValues)
.ToDictionary(v => (string)v["MainTitle"],
v => v["SubTopics"]
.Elements("dict").Select(ParseMyObject).ToList());
解析结果:
{
"Data": [
{
MainTitle: "Miscellaneous",
ListOfSubTitles: [ "CD1", "CD2", "CD3", "CD4" ]
},
{
MainTitle: "Miscellaneous One",
ListOfSubTitles: [ "DDC1", "DDC2", "DDC3", "DDC4", "DDC5" ]
}
],
"Data Two": [
{
MainTitle: "Goblins",
ListOfSubTitles: [ "SSD1", "SS2", "SS3", "SS4" ]
},
{
MainTitle: "Tracks",
ListOfSubTitles: [ "ADC1", "ADC2", "ADC3", "ADC4", "DDC5" ]
}
]
}