2013-07-31 13 views
15

Come posso ottenere xmllint per generare più risultati del selettore xpath per gli attributi "per riga"?Ottieni xmllint per generare risultati xpath n-separati, per selettore di attributo

Prendete questo esempio:

<?xml version="1.0" encoding="ISO-8859-1"?> 
    <config> 
      <tagX key1="value1 " key2=" value2"/> 
      <tagY key3="value3" key4=" value4 "/> 
    </config> 


    $ xmllint example.xml --xpath "/config/*/@*" 

Il risultato è:

key1="value1 " key2=" value2" key3="value3" key4=" value4 " 

Quello che mi piacerebbe ottenere è:

key1="value1 " 
    key2=" value2" 
    key3="value3" 
    key4=" value4 " 

avrei bisogno di dividere dopo e poi quelle pari virgolette numerate o esiste un modo più ordinato per farlo?

C'è una questione connessa, about the same subject tranne che è circa la raccolta di contenuti di <tag>value</tag>, e non <tag attribute="value" />

+0

Questo aiuto - 'echo 'cat/config/*/@ * [inizia con (nome()," chiave ")]' | xmllint --shell input.xml' – devnull

+0

@devnull: '| grep = 'e va bene. (in realtà, no '[starts-with() ...' just '/ @ *' Ho usato "key1, key2 ..." come variabili metasintattiche, i nomi degli attributi attuali sarebbero arbitrari.) –

+0

Sì, 'grep - v' e fatto! – devnull

risposta

11

si può provare:

$ xmllint --shell inputfile <<< `echo 'cat /config/*/@*'` 

Potrebbe essere necessario grep l'uscita, però, in modo da filtra le righe indesiderate.

+2

Il reindirizzamento di here-doc è strano, dovrebbe essere sufficiente dire '<<< 'cat/config/*/@ *'' – Guss

1

La domanda è vecchia, ma come sono arrivato a questo post alla ricerca di una soluzione per lo stesso problema, ecco la mia soluzione

su Linux aggiungere sostituzione sed per suddividere uscita:

$ xmllint example.xml --xpath "/config/*/@*" | sed "s| key|\nkey|g" 

naturalmente il l'espressione di sostituzione dipende dalla struttura xml e dalla query xpath.

E si può anche aggiungere numeri di riga su ogni riga se si aggiunge nl

$ xmllint example.xml --xpath "/config/*/@*" | sed "s| key|\nkey|g" | nl 

che dà

1 key1="value1 " 
    2 key2=" value2" 
    3 key3="value3" 
    4 key4=" value4 " 
+1

Il problema di questo è che dipende dallo schema di denominazione coerente delle chiavi (proprietà) Se non sono "key1, key2" ma "name, birthdate", questo non funzionerà. –

2

Se si tratta di un'opzione, provare a utilizzare xmlstarlet invece:

xmlstarlet sel -t -v "/config/*/@*" example.xml