¿Cómo se analizan los archivos XML?

¿Hay un método simple de analizar archivos XML en C #? ¿Entonces qué?

Utilizaría LINQ to XML si está en .NET 3.5 o superior.

Es muy sencillo. Sé que estos son métodos estándar, pero puede crear su propia biblioteca para lidiar con eso mucho mejor.

Aquí hay unos ejemplos:

XmlDocument xmlDoc= new XmlDocument(); // Create an XML document object xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file // Get elements XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress"); XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge"); XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone"); // Display the results Console.WriteLine("Address: " + girlAddress[0].InnerText); Console.WriteLine("Age: " + girlAge[0].InnerText); Console.WriteLine("Phone Number: " + girlCellPhoneNumber[0].InnerText); 

Además, hay otros métodos para trabajar. Por ejemplo, aquí . Y creo que no hay un mejor método para hacer esto; siempre tiene que elegirlo usted mismo, lo que es más adecuado para usted.

Use un buen Esquema XSD para crear un conjunto de clases con xsd.exe y use un XmlSerializer para crear un árbol de objetos a partir de su XML y viceversa. Si tiene pocas restricciones en su modelo, incluso podría tratar de crear una asignación directa entre las clases de su modelo y el XML con los atributos Xml *.

Hay un artículo introductorio sobre Serialización XML en MSDN.

XmlSerializer rendimiento: la construcción de un XmlSerializer es costoso. Mantenga una referencia a su instancia de XmlSerializer si tiene la intención de analizar / escribir múltiples archivos XML.

Si está procesando una gran cantidad de datos (muchos megabytes), entonces quiere usar XmlReader para analizar el análisis XML.

Cualquier otra cosa ( XPathNavigator , XElement , XmlDocument e incluso XmlSerializer si mantiene el gráfico completo del objeto generado) dará como resultado un gran uso de memoria y también un tiempo de carga muy lento.

Por supuesto, si necesita todos los datos en la memoria de todos modos, es posible que no tenga muchas opciones.

Use XmlTextReader , XmlReader , XmlNodeReader y el espacio de nombres System.Xml.XPath . Y ( XPathNavigator , XPathDocument , XPathExpression , XPathnodeIterator ).

Por lo general, XPath hace que leer XML sea más fácil, que es lo que podrías estar buscando.

Si usa .NET 2.0, pruebe XmlReader y sus subclases XmlTextReader y XmlValidatingReader . Proporcionan una forma rápida, liviana (uso de memoria, etc.), solo para reenviar un archivo XML.

Si necesita capacidades XPath , intente XPathNavigator . Si necesita el documento completo en memoria, intente XmlDocument .

No estoy seguro de si existe la “mejor práctica para analizar XML”. Existen numerosas tecnologías adecuadas para diferentes situaciones. Qué manera de usar depende del escenario concreto.

Puede ir con LINQ a XML , XmlReader , XPathNavigator o incluso expresiones regulares. Si elaboras tus necesidades, puedo intentar dar algunas sugerencias.

Recientemente me han obligado a trabajar en una aplicación que implicaba el análisis sintáctico de un documento XML y estoy de acuerdo con Jon Galloway en que el enfoque basado en LINQ to XML es, en mi opinión, el mejor. Sin embargo, tuve que buscar un poco para encontrar ejemplos utilizables, así que sin más preámbulos, ¡aquí hay algunos!

Cualquier comentario es bienvenido ya que este código funciona, pero puede que no sea perfecto y me gustaría obtener más información sobre el análisis de XML para este proyecto.

 public void ParseXML(string filePath) { // create document instance using XML file path XDocument doc = XDocument.Load(filePath); // get the namespace to that within of the XML (xmlns="...") XElement root = doc.Root; XNamespace ns = root.GetDefaultNamespace(); // obtain a list of elements with specific tag IEnumerable elements = from c in doc.Descendants(ns + "exampleTagName") select c; // obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First(); // obtain an element from within an element, same as from doc XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First(); // obtain an attribute from an element XAttribute attribute = element.Attribute("exampleAttributeName"); } 

Con estas funciones pude analizar cualquier elemento y cualquier atributo de un archivo XML sin ningún problema.

Puede analizar el XML utilizando esta biblioteca System.Xml.Linq . A continuación se muestra el código de muestra que utilicé para analizar un archivo XML

 public CatSubCatList GenerateCategoryListFromProductFeedXML() { string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath); XDocument xDoc = XDocument.Load(path); XElement xElement = XElement.Parse(xDoc.ToString()); List lstCategory = xElement.Elements("Product").Select(d => new Category { Code = Convert.ToString(d.Element("CategoryCode").Value), CategoryPath = d.Element("CategoryPath").Value, Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category }).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList(); CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory); return catSubCatList; } 

Además, puede usar el selector XPath de la siguiente manera (forma fácil de seleccionar nodos específicos):

 XmlDocument doc = new XmlDocument(); doc.Load("test.xml"); var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']"); // select all Book elements in whole dom, with attribute title with value 'Barry Poter' // Retrieve your data here or change XML here: foreach (XmlNode book in nodeList) { book.InnerText="The story began as it was..."; } Console.WriteLine("Display XML:"); doc.Save(Console.Out); 

la documentación

Puede usar ExtendedXmlSerializer para serializar y deserializar.

Instalación Puede instalar ExtendedXmlSerializer desde nuget o ejecutar el siguiente comando:

 Install-Package ExtendedXmlSerializer 

Publicación por entregas:

 ExtendedXmlSerializer serializer = new ExtendedXmlSerializer(); var obj = new Message(); var xml = serializer.Serialize(obj); 

Deserialización

 var obj2 = serializer.Deserialize(xml); 

El serializador XML estándar en .NET es muy limitado.

  • No admite serialización de clase con referencia circular o clase con propiedad de interfaz,
  • No admite diccionarios,
  • No hay ningún mecanismo para leer la versión anterior de XML,
  • Si desea crear un serializador personalizado, su clase debe heredar de IXmlSerializable. Esto significa que su clase no será una clase POCO,
  • No es compatible con IoC.

ExtendedXmlSerializer puede hacer esto y mucho más.

ExtendedXmlSerializer admite .NET 4.5 o superior y .NET Core . Puede integrarlo con WebApi y AspCore.

Puede usar XmlDocument y para manipular o recuperar datos de atributos puede Linq a clases XML.