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(valueElement.Elements().Select(e => ParseValue(e))); } if (valueElement.Name == "dict") { return ParseDict(valueElement); } if (valueElement.Name == "true") { return true; } if (valueElement.Name == "false") { return false; } return null; } } 

它使用如下:

  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()); } } }