Linq to XML with embedded Dictionary and Array
我正在使用Windows Phone 8应用程序:
我有一个这样的文件:
SubTopics ID CD1 CD2 CD3 CD4 Title Miscellaneous Desc this is just a text HasItems ID DDC1 DDC2 DDC3 DDC4 DDC5 Title Miscellaneous One Desc this is just a text HasItems MainTitle Data SubTopics ID SSD1 SS2 SS3 SS4 Title Goblins Desc this is just a text HasItems ID ADC1 ADC2 ADC3 ADC4 DDC5 Title Tracks Desc this is just a text HasItems MainTitle Data Two
如何解析这个?
就像这样 :
MainTitle --SubTitle ---ID ---Desc ---Boolean Value MainTitle --SubTitle ---ID ---Desc ---Boolean Value
基本上是带有键和数组值列表的字典列表。
我试过这样但不完整:
List topics = (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(), ListOfIDs = plist.Element("array") .Elements("dict") .Elements("array") .Elements("string") .Select(s => (string)s) .ToList() }).ToList();
好的,这是一个可以解析你的xml的小类:
public class Parser { public List> Parse(XElement root) { var result = new List>(); foreach (var e in root.Elements()) { if (e.Name == "dict") { result.Add(ParseDict(e)); } } return result; } private Dictionary ParseDict(XElement element) { var dict = new Dictionary(); foreach (var subelement in element.Elements()) { if (subelement.Name == "key") { dict.Add(subelement.Value, ParseValue(subelement.ElementsAfterSelf().First())); } } return dict; } private object ParseValue(XElement valueElement) { if (valueElement.Name == "string") { return valueElement.Value; } if (valueElement.Name == "array") { return new List
它使用如下:
var parser = new Parser(); var doc = XDocument.Load(); var result = parser.Parse(doc.Root);
解析器非常粗糙,并对xml做出假设。 正如之前的评论所指出的那样,使用xml并不是最好的方法,因为元素的位置具有重要意义。 在解析器中使用“object”也不是一个好的解决方案,但如果你想避免这种情况,解析器会更加高级。
我几乎直接使用了Hakan的Parser类:我需要一个整数元素,但没有真或假 – 简单的编辑。 这段代码可以帮助人们测试他们的代码。 我已经重新命名了一些哈坎的符号以适合我的项目。
private void Button_Click_1(object sender, RoutedEventArgs e) { List> topicsList = topicParser.Parse(topicsXDocument.Root); Console.WriteLine("The Topics List contains:"); foreach (Dictionary topic in topicsList) { foreach (KeyValuePair element in topic) { string name = element.Key; object content = element.Value; Console.WriteLine("Key: {0}, Value: {1}", name, content.ToString()); } } }