Lista distinta de valores de atributos de XML, utilizando un conjunto predefinido de nombres de atributos -- # campo con performance campo con linq campo con xml campo con xpath camp codereview Relacionados El problema

Distinct List of attribute values from XML, using a pre-defined set of attribute names


2
vote

problema

Español

Tengo una corriente XML que se parece a la siguiente (cantidad y cantidad de nodo y profundidad de nodo reducido para fines de demostración).

  <itinerary>   <organizer>     <company name="ACME" billingLocation="London" adminOffice="Manchester">   </organizer>   <traveller name="John Smith" homeCity="London" />   <flight date="20160317" code="BA101" origin="London" destination="New York" />   <vehicleHire start="20160317" end="20160317">     <depot type="pickup" location="London" />     <depot type="return" location="Heathrow" />   </vehicleHire>   <hotel location="New York" checkin="20160317" checkout="20160318" />   <journey>     <train date="20160318">       <origin station="New York" />       <destination station="Boston" />     </train> </itinerary>   

Me gustaría obtener una distinta Lista de atributos valores donde el nombre del atributo está en (billingLocation,adminOffice,homeCity,origin,destination,location,station) , pero mi final / real La lista de nombres de atributos se numerará alrededor de 30.

Tengo este código C # que trabaja usando XmlDocument y una consulta XPath, pero no estoy seguro de si este es el método más eficiente.

  XmlDocument xd = new XmlDocument(); xd.Load(customProvider.GetStream()); XmlNodeList nl = xd.SelectNodes(@"//@billingLocation|//@adminOffice|//@homeCity|//@origin|//@destination|//@location|//@station"); var lst = nl.Cast<XmlAttribute>().Select(a => a.Value).Distinct().ToList();   

El XML final será más complejo y tendrá una jerarquía más profunda, y los atributos pueden ocurrir en diferentes nodos.

es xmldocument y xpath el apuro más eficiente, o que Linq a XML quizás sea más rápido, y ¿qué se vería?

Original en ingles

I have an XML stream that looks like the following (attribute and node quantity , and node depth reduced for demonstration purposes.)

<itinerary>   <organizer>     <company name="ACME" billingLocation="London" adminOffice="Manchester">   </organizer>   <traveller name="John Smith" homeCity="London" />   <flight date="20160317" code="BA101" origin="London" destination="New York" />   <vehicleHire start="20160317" end="20160317">     <depot type="pickup" location="London" />     <depot type="return" location="Heathrow" />   </vehicleHire>   <hotel location="New York" checkin="20160317" checkout="20160318" />   <journey>     <train date="20160318">       <origin station="New York" />       <destination station="Boston" />     </train> </itinerary> 

I'd like to get a distinct list of attribute values where the attribute name is in (billingLocation,adminOffice,homeCity,origin,destination,location,station), but my final/actual list of attribute names will number around 30.

I have this C# code working using XmlDocument and an XPath query, but I'm unsure if this is the most efficient method.

XmlDocument xd = new XmlDocument(); xd.Load(customProvider.GetStream()); XmlNodeList nl = xd.SelectNodes(@"//@billingLocation|//@adminOffice|//@homeCity|//@origin|//@destination|//@location|//@station"); var lst = nl.Cast<XmlAttribute>().Select(a => a.Value).Distinct().ToList(); 

The final XML will be more complex and have a deeper hierarchy, and the attributes might occur across different nodes.

Is XmlDocument and XPath the most efficient aproach, or would Linq to XML perhaps be faster, and what would that look like?

              
   
   

Lista de respuestas

2
 
vote

Mientras no se enfrente a problemas de rendimiento notables, elegiría el método que sea mejor para usted. El XPath funciona para que puedas seguir adelante.

Sin embargo, construiría la ruta de una manera más genérica al especificar una matriz de nombres de atributos primero:

  delete7  

y los combinándolos en una consulta:

  delete8  

En este CAS, sin embargo, es un poco más fácil para hacer lo mismo con Linq:

analizar primero el XML (que es no válido en su ejemplo: algunos elementos no están cerrados):

  delete9  

Luego use la misma matriz para la consulta LINQ:

  malloc0  
 

As long as you don't face noticable performance issues I would chose whatever method seems to be better for you. The XPath works so you may stick to it.

I would however build the path in a more generic way by specifying an array of attribute names first:

var attributeNames = new[] {     "billingLocation",     "adminOffice",     "homeCity",     "origin",     "destination",     "location",     "station" } 

and the combining them into a query:

var xPath = string.Join("|", attributeNames.Select(n => $"//@{n}")); ...xd.SelectNodes(xPath); 

In this cas however it is a little bit easier to do the same with linq:

Parse the xml first (which is btw invalid in your example - some elements are not closed):

var xElement = XElement.Parse(text); 

Then use the same array for the linq query:

var cities =     (from attr in xElement.Descendants().Attributes()      where attributeNames.Contains(attr.Name.LocalName)      select attr.Value).Distinct(); 
 
 

Relacionados problema

3  Obtenga INNERNERHTML, OUTERHTML y texto simple de un elemento por ID o Clase  ( Get innerhtml outerhtml and plain text of an element by id or class ) 
Hago una buena cantidad de raspado, pero de ninguna manera es un buen programador PHP. Siempre lucho para obtener el innerhtml de elementos usando PHP, DOMDOC...

3  Usando SCRAPADORES / XPATH para raspar comentarios de ESPN para el fútbol (fútbol)  ( Using scrapy xpath to scrape espn for football soccer commentaries ) 
La clase toma una entrada de un ID de juego del sitio web de ESPN Soccer. El código tiene que agarrar el comentario, procesar que también agarrar los nombres ...

1  Manejo de la entrada de XPath de un usuario  ( Handling xpath input from a user ) 
Quiero diseñar API que podría manejar la entrada XPATH de un usuario. Actualmente modelo la entrada XPath de la siguiente manera: productFilter = {...

2  Scrating Google Apps Page y almacene detalles de la aplicación en la base de datos  ( Scrape google apps page and store application details in database ) 
A continuación se muestra un script de Python que raspa la URL específica de las aplicaciones de Google, por ejemplo, https://play.google.com/store/apps/deta...

3  Fusionar la información del sitio web en una matriz  ( Merging website info into an array ) 
Estoy raspando un título y un enlace de un sitio web y colocándolos en una sola matriz. El Ordenar313 la variable me parece un poco mal, o está perfectament...

13  Funciones para ocultar y reclamar la primera publicación visible en una página usando Selenium  ( Functions to hide and reclaim first visible publication on a page using selenium ) 
Tengo las siguientes funciones en JavaScript: function SelectFirstVisiblePublicationAndHideIt ( PageObj ) { var hideButtonXpath = "//img[@title='To hid...

2  Verifique si el elemento se puede deshabilitar de forma lectura o desactivada  ( Verify if the element is readonly or disabled ) 
He escrito una función donde verifica si el campo es de solo lectura o deshabilitado. Sin embargo, primero revise si ese campo de elementos está presente Es...

2  Beautifulsup y LXML (XPATH) demasiado lento con respecto a la regulación al analizar HTML  ( Beautifulsoup and lxml xpath too slow with respect to regex when parsing html ) 
Estoy de acuerdo en que usar REGEX para analizar HTML no es un Buena manera , en particular estoy preocupado por su fragilidad con respecto al cambio en el H...

2  Aprovechando XML y seleccionando nodos basados ​​en la entrada para convertir a CSV  ( Flattening xml and selecting nodes based on input to convert to csv ) 
Tengo un poco de xml que quiero aplanar en función de su xpath. La tarea es adquirir ciertos nodos que se pasen como entrada. Dicho esto, tengo que llegar a l...

1  Problema de rendimiento al obtener texto de un nodo de contexto con VTD-XML  ( Performance problem when getting text from a context node with vtd xml ) 
Tengo una estructura como esta: <a> <b> <c>foo</c> <d>bar</d> </b> <b> <c>baz</c> <d>qux</d> </b> </a> Fije /a/b Como context...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos