Análisis XML: lea un archivo XML simple y recupere valores

He escrito un progtwig de Progtwigción de tareas para fines de aprendizaje. Actualmente estoy guardando las tareas progtwigdas solo como texto plano y luego analizando usando Regex. Esto se ve sucio (en cuanto al código) y no es muy coherente.

Me gustaría cargar las tareas progtwigdas desde un archivo XML en su lugar, he buscado bastante para encontrar algunas soluciones, pero no pude hacer que funcionara como quería.

Escribí un archivo XML estructurado de esta manera para almacenar mis datos en:

  Shutdown C:/WINDOWS/system32/shutdown.exe -s -f -t 30  8:00:00 am 18/03/2011  false false false false false false false true false   true   

La forma en que me gustaría analizar los datos es así:

  1. Abra Tasks.xml
  2. Cargue la primera etiqueta de Tarea.
  3. En esa tarea recupera los valores de las tags Nombre, Ubicación y Argumentos.
  4. A continuación, abra la etiqueta RunWhen y recupere los valores de las tags de Hora y Fecha.
  5. Después de eso, abra la etiqueta Días y recupere el valor de cada etiqueta individual dentro.
  6. Recupera el valor de Habilitado.
  7. Cargue la siguiente tarea y repita los pasos 3 -> 7 hasta que se hayan analizado todas las tags de tareas en Tareas.

Estoy muy seguro de que puedes hacerlo de esta manera. No puedo resolverlo ya que hay muchas formas diferentes de hacer las cosas en XML. Me abrumaron un poco. Pero lo que he llegado hasta ahora es que lo más probable es que esté usando XPathDocument y XPathNodeIterator ¿verdad?

Si alguien me puede mostrar un ejemplo o explicarme cómo se haría, sería muy feliz.

Una forma sencilla de analizar el xml es usar LINQ to XML

por ejemplo, tiene el siguiente archivo xml

   Who We Be RMX (feat. 2Pac) DMX The Dogz Mixtape: Who's Next?!   Angel (ft. Regina Bell) DMX ...And Then There Was X   Dreaming Your Dreams Hybrid Wide Angle   Finished Symphony Hybrid Wide Angle   

Para leer este archivo, puede usar el siguiente código:

 public void Read(string fileName) { XDocument doc = XDocument.Load(fileName); foreach (XElement el in doc.Root.Elements()) { Console.WriteLine("{0} {1}", el.Name, el.Attribute("id").Value); Console.WriteLine(" Attributes:"); foreach (XAttribute attr in el.Attributes()) Console.WriteLine(" {0}", attr); Console.WriteLine(" Elements:"); foreach (XElement element in el.Elements()) Console.WriteLine(" {0}: {1}", element.Name, element.Value); } } 

Usualmente uso XmlDocument para esto. La interfaz es bastante directa:

 var doc = new XmlDocument(); doc.LoadXml(xmlString); 

Puede acceder a nodos similares a un diccionario:

 var tasks = doc["Tasks"]; 

y recorrer todos los hijos de un nodo.

Pruebe XmlSerialization

prueba esto

 [Serializable] public class Task { public string Name{get; set;} public string Location {get; set;} public string Arguments {get; set;} public DateTime RunWhen {get; set;} } public void WriteXMl(Task task) { XmlSerializer serializer; serializer = new XmlSerializer(typeof(Task)); MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream, Encoding.Unicode); serializer.Serialize(writer, task); int count = (int)stream.Length; byte[] arr = new byte[count]; stream.Seek(0, SeekOrigin.Begin); stream.Read(arr, 0, count); using (BinaryWriter binWriter=new BinaryWriter(File.Open(@"C:\Temp\Task.xml", FileMode.Create))) { binWriter.Write(arr); } } public Task GetTask() { StreamReader stream = new StreamReader(@"C:\Temp\Task.xml", Encoding.Unicode); return (Task)serializer.Deserialize(stream); } 

¿Estás familiarizado con la clase DataSet ?

El DataSet también puede load documentos XML y es posible que le resulte más fácil iterar.

http://msdn.microsoft.com/en-us/library/system.data.dataset.readxml.aspx

 DataSet dt = new DataSet(); dt.ReadXml(@"c:\test.xml"); 
 class Program { static void Main(string[] args) { //Load XML from local string sourceFileName=""; string element=string.Empty; var FolderPath=@"D:\Test\RenameFileWithXmlAttribute"; string[] files = Directory.GetFiles(FolderPath, "*.xml"); foreach (string xmlfile in files) { try { sourceFileName = xmlfile; XElement xele = XElement.Load(sourceFileName); string convertToString = xele.ToString(); XElement parseXML = XElement.Parse(convertToString); element = parseXML.Descendants("Meta").Where(x => (string)x.Attribute("name") == "XMLTAG").Last().Value; DirectoryInfo CurrentDate = Directory.CreateDirectory(DateTime.Now.ToString("yyyy-MM-dd")); string saveWithThisName= Path.Combine(CurrentDate.FullName, element); File.Copy(sourceFileName, saveWithThisName,true); } catch(Exception ex) { } } } }