2011-02-23 12 views
7

Me preguntaba si XPath podría devolver una matriz de valor.¿Cómo devolver una matriz con XPath?

Tengo calle detrás de esta manera:

<Cities> 
    <City>Paris</City> 
    <City>Lyon</City> 
    <City>Marseille</City> 
</Cities> 

y me gustaría obtener una matriz de esta forma [ 'París', 'Lyon', 'Marsella'].

Estoy usando la utilidad xpath UNIX.

¿Alguna idea?

+0

No es exacto, pero es lo mismo [Cómo obtener una lista de cadenas de Dom4j Node.selectObject o Node.selectNodes] (http://stackoverflow.com/questions/4628647/how-to-get-a-list -of-string-from-dom4j-node-selectobject-o-node-selectnodes). Si desea un resultado de tipo de datos de secuencia, debe usar XPath 2.0 –

+0

Buena pregunta, +1. Ver mi respuesta para una explicación y solución. :) –

Respuesta

5

Además de post-procesar la salida de:

xpath -q -e '//City/text()' inputfile 

que es:

Paris 
Lyon 
Marseille 

en cualquier número de maneras, incluyendo:

xpath -q -e '//City/text()' inputfile | 
    awk 'BEGIN {sq = "\047"; OFS = sq "," sq} 
     {a[$1] = NR} 
     END { 
      printf "[" sq; 
      for (i in a) { 
       printf "%s%s", d, i; d = OFS}; 
      print sq "]" 
     }' 

que da la salida:

['Lyon','Marseille','Paris'] 

puede usar mi versión modificada de xpath.Dado que es un simple script de Perl, lo modifiqué para que tenga más control sobre el formateo de la salida. Con mi versión, puede hacer:

xpath -q -b "[" -p "'" -i "," -s "'" -a "]"$'\n' -e '//City/text()' 

para obtener la salida deseada. Aquí está el mensaje de uso:

Usage: 
xpath [options] -e query [-e query...] [filename...] 

     If no filenames are given, supply XML on STDIN. 
     You must provide at least one query. Each supplementary 
     query is done in order, the previous query giving the 
     context of the next one. 

     Options: 

     -q quiet  Only output the resulting PATH 
     -b before  use before instead of nothing. 
     -p prefix  use prefix instead of nothing. 
     -s suffix  use suffix instead of linefeed. 
     -i infix  use infix instead of nothing. 
     -a after  use after instead of nothing. 

Puede download my version here.

1

, sé que en .Net puede hacerlo en xmlDocument. xDoc.SelectNodes("//City"); le da una lista de nodos y para cada nodo puede hacer NODE.FirstChild.Value para obtener los nombres.

1

Esta expresión XPath:

/*/*/text() 

selecciona exactamente los tres quería nodos de texto.

Se puede utilizar con una notación de matriz-como:

/*/*/text()[1] 

selecciona el texto-nodo

"Paris" 

,

/*/*/text()[2] 

selecciona el texto-nodo

"Lyon" 

,

/*/*/text()[3] 

selecciona el texto nodos

"Marseille" 

Si desea sólo el valor de la cadena de cualquiera de estos nodos de texto, utilice (por ejemplo):

string(/*/*/text()[2]) 

El resultado de evaluar esta expresión XPath es el st anillo

"Lyon" 
Cuestiones relacionadas