xdocument example ejemplos c# wpf windows-phone-8 xml-parsing linq-to-xml

example - linq to xml c# ejemplos



Parse xml con clave variable (1)

Estoy tratando de analizar el XML a continuación:

<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>

Este es mi analizador:

XDocument doc = XDocument.Load(FileName); Dictionary<string, List<Chapter>> plistData = doc.Root.Element("array").Elements("dict") .Select(GetValues) .ToDictionary(v => (string)v["MainTitle"], v => v["SubTitle"] .Elements("dict").Select(ParseMyObject).ToList()); static Dictionary<string, XElement> GetValues(XElement dict) { return dict.Elements("key") .ToDictionary(k => (string)k, k => (XElement)k.NextNode); } static Chapter ParseMyObject(XElement dict) { var values = GetValues(dict); return new Topic { Title = (string)values["Title"], FileNames = values["Values"].Elements().Select(s =>(string)s).ToList() }; }

Por favor, vea el comentario que he agregado en el archivo XML. El problema aquí es que los primeros dos dict tienen key como SubTitle con array pero el tercer dict no tiene ninguna key .

¿Cómo debo analizar esto?

Estoy trabajando en Windows Phone 8 y estoy tratando de analizar el XML y completar los datos en una interfaz de usuario. Así es como se ve mi IU: tengo 3 botones: Ciencia, Física y Aleatorio.

Cuando hago clic en "Ciencia" obtengo "Capítulo uno y capítulo dos"; si hago clic en el capítulo uno o el capítulo dos obtengo todos los valores del XML.

Pero cuando hago clic en "Aleatorio" necesito obtener solo valores del XML.

EDITAR

para imprimir valores:

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 }


Para fines de depuración, dividí tu colección en dos pasos:

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

Ayudante para la última estructura plist

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

Agregué un cheque cuando creaste el elemento del diccionario si la clave MainTitle realmente existe. Si no, agrego una clave predeterminada. El mismo mecanismo se aplica a SubTitle , si eso no existe se proporciona un valor nulo.