Ok, reabrí esto. El duplicado era una solución de lector XML, ya que se trata de analizar archivos XML. El posible duplicado se puede ver en el historial de edición de preguntas ps @GeorgeStocker
Jeremy Thompson
1
@JeremyThompson Una de las razones por las cuales esto fue un duplicado es que la otra pregunta tiene una respuesta mucho mejor. La respuesta principal es una simple respuesta de "solo enlace" no es útil.
George Stocker
1
@GeorgeStocker las preguntas son lo suficientemente diferentes como para coexistir y ambas tienen excelentes respuestas, además de que las aceptadas están utilizando diferentes tecnologías. Es por eso que voté que dejáramos esto abierto, sé que este aceptado es solo un enlace, pero es MSDN y fue escrito en un momento antes de que eso fuera inaceptable, es de esperar que un efecto secundario de la reapertura esté animando a Jon un poco, lea su perfil . De todos modos saludos.
Jeremy Thompson el
Respuestas:
245
Que haría uso de LINQ to XML si estás en .NET 3.5 o superior.
Es muy simple. Sé que estos son métodos estándar, pero puedes crear tu propia biblioteca para lidiar con eso mucho mejor.
Aquí hay unos ejemplos:
XmlDocument xmlDoc=newXmlDocument();// Create an XML document object
xmlDoc.Load("yourXMLFile.xml");// Load the XML document from the specified file// Get elementsXmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge");XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");// Display the resultsConsole.WriteLine("Address: "+ girlAddress[0].InnerText);Console.WriteLine("Age: "+ girlAge[0].InnerText);Console.WriteLine("Phone Number: "+ girlCellPhoneNumber[0].InnerText);
Además, hay algunos otros métodos para trabajar. Por ejemplo, aquí . Y creo que no hay un mejor método para hacer esto; siempre debe elegirlo usted mismo, lo que sea más adecuado para usted.
+1 por mencionar XmlDocument, que es mucho más conveniente que las interfaces de serialización en algunos casos. Si busca un elemento específico, puede acceder a elementos secundarios con el indexador: xmlDoc ["Root"], y estos se pueden encadenar: xmlDoc ["Root"] ["Carpeta"] ["Elemento"] para excavar jerarquía (aunque es sensato validar que estos elementos realmente existen)
Jason Williams
1
InnerTextaquí obtiene el valor de ese nodo, concatenado con todos los valores de los nodos secundarios, ¿verdad? Parece una cosa extraña querer.
Don Cheadle
17
¿Un programador con una lista de amigas? ¡Engaños!
E. van Putten
1
@ E.vanPutten no en este día y edad. Esto no es La venganza de los nerds
user4052054
@DonCheadle Si usted no está esperando allí para ser nodos secundarios, a continuación, InnerTextsimplemente devolverá el valor del nodo - que es lo que (y probablemente todos los demás leer esta pregunta) Estoy análisis del XML de encontrar en el primer lugar.
F1Krazy
48
Use un buen esquema XSD para crear un conjunto de clases con xsd.exe y use un XmlSerializerpara crear un árbol de objetos a partir de su XML y viceversa. Si tiene pocas restricciones en su modelo, incluso podría intentar crear una asignación directa entre sus clases de modelo y el XML con los Atributos Xml *.
Consejo de rendimiento: la construcción de un XmlSerializeres costoso. Mantenga una referencia a su XmlSerializerinstancia si tiene la intención de analizar / escribir múltiples archivos XML.
Un buen ejemplo es el "Ejemplo de orden de compra" en el medio de este ejemplo de microsoft. msdn.microsoft.com/en-us/library/58a18dwa.aspx . Evita tener que crear un esquema: su clase de C # es el esquema, adornado con atributos de C #.
Mark Lakata
25
Si está procesando una gran cantidad de datos (muchos megabytes), entonces desea usar XmlReaderpara analizar el XML.
Todo lo demás ( XPathNavigator, XElement, XmlDocumente incluso XmlSerializersi se mantiene la gráfica completa objeto generado) resultará en uso de memoria alta 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.
Para su información, no debe usar new XmlTextReader()o new XmlTextWriter(). Han quedado en desuso desde .NET 2.0. Uso XmlReader.Create()o en su XmlWriter.Create()lugar.
John Saunders
10
Recientemente, se me solicitó trabajar en una aplicación que implicaba el análisis 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 cavar 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 cómo analizar XML para este proyecto.
publicvoidParseXML(string filePath){// create document instance using XML file pathXDocument 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 tagIEnumerable<XElement> 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 docXElement element =(from c in doc.Descendants(ns +"exampleTagName"select c).First();// obtain an element from within an element, same as from docXElement embeddedElement =(from c in element.Descendants(ns +"exampleEmbeddedTagName"select c).First();// obtain an attribute from an elementXAttribute attribute = element.Attribute("exampleAttributeName");}
¡Con estas funciones pude analizar cualquier elemento y cualquier atributo de un archivo XML sin ningún problema!
Si está utilizando .NET 2.0, pruebe XmlReadery sus subclases XmlTextReader, y XmlValidatingReader. Proporcionan una forma rápida, liviana (uso de memoria, etc.), solo hacia adelante para analizar un archivo XML.
Si necesita XPathcapacidades, pruebe el XPathNavigator. Si necesita todo el documento en memoria, intente XmlDocument.
Además, puede usar el selector XPath de la siguiente manera (manera fácil de seleccionar nodos específicos):
XmlDocument doc =newXmlDocument();
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);
No estoy seguro de si existe la "mejor práctica para analizar XML". Existen numerosas tecnologías adecuadas para diferentes situaciones. La forma de usar depende del escenario concreto.
Usted puede ir con LINQ to XML , XmlReader, XPathNavigatoro incluso expresiones regulares. Si elabora sus necesidades, puedo intentar darle algunas sugerencias.
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
Respuestas:
Que haría uso de LINQ to XML si estás en .NET 3.5 o superior.
fuente
Es muy simple. Sé que estos son métodos estándar, pero puedes crear tu propia biblioteca para lidiar con eso mucho mejor.
Aquí hay unos ejemplos:
Además, hay algunos otros métodos para trabajar. Por ejemplo, aquí . Y creo que no hay un mejor método para hacer esto; siempre debe elegirlo usted mismo, lo que sea más adecuado para usted.
fuente
InnerText
aquí obtiene el valor de ese nodo, concatenado con todos los valores de los nodos secundarios, ¿verdad? Parece una cosa extraña querer.InnerText
simplemente devolverá el valor del nodo - que es lo que (y probablemente todos los demás leer esta pregunta) Estoy análisis del XML de encontrar en el primer lugar.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 intentar crear una asignación directa entre sus clases de modelo y el XML con los Atributos Xml *.Hay un artículo introductorio sobre la serialización XML en MSDN.
Consejo de rendimiento: la construcción de un
XmlSerializer
es costoso. Mantenga una referencia a suXmlSerializer
instancia si tiene la intención de analizar / escribir múltiples archivos XML.fuente
Si está procesando una gran cantidad de datos (muchos megabytes), entonces desea usar
XmlReader
para analizar el XML.Todo lo demás (
XPathNavigator
,XElement
,XmlDocument
e inclusoXmlSerializer
si se mantiene la gráfica completa objeto generado) resultará en uso de memoria alta 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.
fuente
Uso
XmlTextReader
,XmlReader
,XmlNodeReader
y elSystem.Xml.XPath
espacio de nombres. Y (XPathNavigator
,XPathDocument
,XPathExpression
,XPathnodeIterator
).Por
XPath
lo general, facilita la lectura de XML, que es lo que podría estar buscando.fuente
new XmlTextReader()
onew XmlTextWriter()
. Han quedado en desuso desde .NET 2.0. UsoXmlReader.Create()
o en suXmlWriter.Create()
lugar.Recientemente, se me solicitó trabajar en una aplicación que implicaba el análisis 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 cavar 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 cómo analizar XML para este proyecto.
¡Con estas funciones pude analizar cualquier elemento y cualquier atributo de un archivo XML sin ningún problema!
fuente
Si está utilizando .NET 2.0, pruebe
XmlReader
y sus subclasesXmlTextReader
, yXmlValidatingReader
. Proporcionan una forma rápida, liviana (uso de memoria, etc.), solo hacia adelante para analizar un archivo XML.Si necesita
XPath
capacidades, pruebe elXPathNavigator
. Si necesita todo el documento en memoria, intenteXmlDocument
.fuente
Además, puede usar el selector XPath de la siguiente manera (manera fácil de seleccionar nodos específicos):
la documentación
fuente
No estoy seguro de si existe la "mejor práctica para analizar XML". Existen numerosas tecnologías adecuadas para diferentes situaciones. La forma de usar depende del escenario concreto.
Usted puede ir con LINQ to XML ,
XmlReader
,XPathNavigator
o incluso expresiones regulares. Si elabora sus necesidades, puedo intentar darle algunas sugerencias.fuente
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 XMLfuente
Puede usar ExtendedXmlSerializer para serializar y deserializar.
Instalación Puede instalar ExtendedXmlSerializer desde nuget o ejecutar el siguiente comando:
Publicación por entregas:
Deserialización
El serializador XML estándar en .NET es muy limitado.
ExtendedXmlSerializer puede hacer esto y mucho más.
ExtendedXmlSerializer admite .NET 4.5 o superior y .NET Core . Puede integrarlo con WebApi y AspCore.
fuente
Puede usar XmlDocument y para manipular o recuperar datos de los atributos puede Linq a clases XML.
fuente