recorrer nodo modificar manipular leer lector especifico elementos crear atributos archivo c# xml

nodo - ¿Cómo leo y analizo un archivo XML en C#?



manipular xml en c# (10)

¿Cómo leo y analizo un archivo XML en C #?


LINQ to XML Ejemplo:

// Loading from a file, you can also load from a stream var xml = XDocument.Load(@"C:/contacts.xml"); // Query the data and write out a subset of contacts var query = from c in xml.Root.Descendants("contact") where (int)c.Attribute("id") < 4 select c.Element("firstName").Value + " " + c.Element("lastName").Value; foreach (string name in query) { Console.WriteLine("Contact''s Full Name: {0}", name); }

Referencia : LINQ to XML en MSDN


Aquí hay una aplicación que escribí para leer mapas de XML:

using System; using System.Collections.Generic; using System.Windows.Forms; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Data; using System.Xml; namespace SiteMapReader { class Program { static void Main(string[] args) { Console.WriteLine("Please Enter the Location of the file"); // get the location we want to get the sitemaps from string dirLoc = Console.ReadLine(); // get all the sitemaps string[] sitemaps = Directory.GetFiles(dirLoc); StreamWriter sw = new StreamWriter(Application.StartupPath + @"/locs.txt", true); // loop through each file foreach (string sitemap in sitemaps) { try { // new xdoc instance XmlDocument xDoc = new XmlDocument(); //load up the xml from the location xDoc.Load(sitemap); // cycle through each child noed foreach (XmlNode node in xDoc.DocumentElement.ChildNodes) { // first node is the url ... have to go to nexted loc node foreach (XmlNode locNode in node) { // thereare a couple child nodes here so only take data from node named loc if (locNode.Name == "loc") { // get the content of the loc node string loc = locNode.InnerText; // write it to the console so you can see its working Console.WriteLine(loc + Environment.NewLine); // write it to the file sw.Write(loc + Environment.NewLine); } } } } catch { } } Console.WriteLine("All Done :-)"); Console.ReadLine(); } static void readSitemap() { } } }

Código en Paste Bin http://pastebin.com/yK7cSNeY



Hay diferentes maneras, dependiendo de dónde quieres llegar. XmlDocument es más ligero que XDocument, pero si desea verificar de manera minimalista que una cadena contiene XML, la expresión regular es posiblemente la opción más rápida y liviana que puede hacer. Por ejemplo, he implementado pruebas de humo con SpecFlow para mi API y deseo probar si alguno de los resultados tiene algún XML válido, entonces usaría una expresión regular. Pero si necesito extraer valores de este XML, entonces lo analizaré con XDocument para hacerlo más rápido y con menos código. O usaría XmlDocument si tuviera que trabajar con un XML grande (y algunas veces trabajo con XML que tienen alrededor de 1M de líneas, aún más); Entonces podría incluso leerlo línea por línea. ¿Por qué? Intente abrir más de 800 MB en bytes privados en Visual Studio; incluso en producción no debería tener objetos más grandes que 2GB. Puedes con un twerk, pero no deberías. Si tuviera que analizar un documento, que contiene MUCHAS líneas, es probable que estos documentos sean CSV.

He escrito este comentario, porque veo una gran cantidad de ejemplos con XDocument. XDocument no es bueno para documentos grandes, o cuando solo desea verificar si el contenido es XML válido. Si desea comprobar si el XML en sí tiene sentido, entonces necesita un esquema.

También bajé la respuesta sugerida porque creo que necesita la información anterior dentro de sí misma. Imagínese que necesito verificar si 200M de XML, 10 veces por hora, es XML válido. XDocument desperdiciará una gran cantidad de recursos.

Prasanna Venkatesh también indica que podría intentar completar la cadena en un conjunto de datos, también indicará un XML válido.


Hay muchas maneras, algunas:

  • XmlSerializer. use una clase con el esquema de destino que desea leer: use XmlSerializer para obtener los datos en un Xml cargado en una instancia de la clase.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (acceso de solo lectura)

Podría usar un DataSet para leer cadenas XML.

var xmlString = File.ReadAllText(FILE_PATH); var stringReader = new StringReader(xmlString); var dsSet = new DataSet(); dsSet.ReadXml(stringReader);

Publicar esto por el bien de la información.



XmlDocument para leer un XML desde una cadena o desde un archivo.

XmlDocument doc = new XmlDocument(); doc.Load("c://temp.xml");

o

doc.LoadXml("<xml>something</xml>");

luego encuentra un nodo debajo de él, es decir, así

XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");

o

foreach(XmlNode node in doc.DocumentElement.ChildNodes){ string text = node.InnerText; //or loop through its children as well }

entonces lee el texto dentro de ese nodo como este

string text = node.InnerText;

o leer un atributo

string attr = node.Attributes["theattributename"]?.InnerText

Siempre verifique si hay nulos en los atributos ["algo"] ya que será nulo si el atributo no existe.


Linq a XML.

Además, VB.NET tiene mucho mejor soporte de análisis de XML a través del compilador que C #. Si tienes la opción y el deseo, échale un vistazo.


public void ReadXmlFile() { string path = HttpContext.Current.Server.MapPath("~/App_Data"); // Finds the location of App_Data on server. XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, "XMLFile7.xml")); //Combines the location of App_Data and the file name while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: break; case XmlNodeType.Text: columnNames.Add(reader.Value); break; case XmlNodeType.EndElement: break; } } }

Puede evitar la primera declaración y simplemente especificar el nombre de la ruta en el constructor de XmlTextReader.