Come posso ottenere il valore di un attributo utilizzando xmllint e XPath?

Voglio ottenere il valore di nome e metterlo in una variabile utilizzando XMLLint

<body>
<value name="abc"></value>
</body>

echo 'cat //body/value/@name' | xmllint --shell "test.xml"

/>  -------
 name="abc"
/> 

Quindi voglio assegnare il valore “abc” alla variabile $test

 

4 Replies
  1. 28

    È necessario utilizzare fn:string(), che restituirà il valore del suo argomento come xs:string. Nel caso In cui l’argomento è un attributo, dunque, restituire il valore dell’attributo come xs:string.

    test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
    • purtroppo –xpath non è supportato su un lotto di impianti di
    • stackoverflow.com/questions/11975862/…
    • Questo dimostra solo il valore di un singolo elemento, è possibile ottenere di più partite?
  2. 8

    Provare questo, non è bello, ma funziona 🙂

    Ho appena cancellare le linee contenenti > da stdout , tagliare la corda per ottenere la seconda parte dopo il = , ed eliminare “

    test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \"); 
    echo $test
    • Utilizzare xmllint quindi non è necessario utilizzare fonti rinnovabili per il parsing XML. Ti accorgi di avere di utilizzare fonti rinnovabili per analizzare l’output di xmllint.
    • perché la stampa ——- prima il nome dell’attributo valore? come rimuoverlo?
  3. 4

    Recentemente ho dovuto porto il mio originale soluzione più semplice usando –xpath per una piattaforma privi di questa caratteristica, quindi doveva adottare il “gatto” soluzione troppo. Questo permetterà di gestire più partite, testato su Ubuntu 12.04 e Solaris 11:

    getxml() { # $1 = xml file, $2 = xpath expression
        echo "cat $2" | xmllint --shell $1 |\
        sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1/gp'
    }

    ad esempio, l’estrazione di nomi di istanza da glassfish dominio config:

    $ getxml /tmp/test.xml "//server[@node-ref]/@name"
    inst1
    inst2

    Sed post-processing appena afferra citati valori che è stato adeguato per le mie esigenze (recupero di bit di glassfish config).

  4. 4

    Un approccio con una helper awk comando che supporta più attributi (una versione semplificata di ego approccio):

    echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }'

    Il awk comando:

    • divide xmllint‘s linee di uscita in campi da " caratteri. (-F\")

      • Nota che xmllint normalizza citando intorno ai valori di attributo per "..." in uscita, anche se l’ingresso era '...', quindi è sufficiente dividere per ".
    • solo i processi di linee pari (NR %2 == 0), quindi filtrare le linee di separazione che cat invariabilmente stampe.

    • print $2 poi viene stampato solo il 2 ° campo, che è il valore di ogni attributo senza il contorno "...".

    Assumendo il seguente esempio di codice XML in file:

    <body>
      <value name="abc"></value>
      <value name="def"></value>
    </body>

    di cui sopra si ottiene:

    abc
    def
    • questo funziona per me, grazie. Anche tu hai un bel modo di assegnare i valori alle variabili diverse. Come VAR_1=$(echo ‘cat //*/@name’ | xmllint –shell file | awk -F\ \ ” ‘NR % 2 == 0 { print $2 }’) ?
    • È possibile read le linee in uscita nelle variabili (sia in un while loop o, in Bash, in un array con read -a); se avete bisogno di ulteriori informazioni, si prega di fare una nuova domanda.

Lascia un commento