2013-07-31 5 views
15

Wie kann ich xmllint erhalten, um mehrere Ergebnisse der Xpath-Selektor für Attribute "pro Zeile" auszugeben?Get Xmllint zu Ausgabe Xpath Ergebnisse n-getrennt, für Attributselektor

Nehmen Sie dieses Beispiel:

<?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/*/@*" 

Das Ergebnis ist:

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

Was Ich mag würde bekommen, ist:

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

Würde ich nach gerad- aufteilen müssen nummerierte Anführungszeichen, oder gibt es eine bessere Möglichkeit, dies zu tun?

Es gibt eine ähnliche Frage, about the same subject außer es geht um Inhalte <tag>value</tag> herauszupicken, und nicht <tag attribute="value" />

+0

Hilft dies - 'echo 'cat/config/*/@ * [startet mit (name()," key ")]' | xmllint --shell input.xml' – devnull

+0

@devnull: '| grep = 'und es ist in Ordnung. (eigentlich kein '[startet mit ...]' nur '/ @ *' Ich habe "key1, key2 ..." als metasyntaktische Variablen verwendet, die tatsächlichen Attributnamen wären beliebig.) –

+0

Ja, 'grep - v' und fertig! – devnull

Antwort

11

Sie können versuchen:

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

Sie müssen möglicherweise zu grep die Ausgabe, obwohl, so dass filtere die unerwünschten Linien.

+2

Die Here-Doc-Redirect ist seltsam, es sollte genug sein, sagen '<<< 'cat/config/*/@ *'' – Guss

1

Die Frage ist alt, aber als ich auf diesen Beitrag kam eine Lösung für das gleiche Problem suchen, hier ist meine Lösung

Unter Linux sed Substitution hinzufügen Ausgang spalten:

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

natürlich die Der Substitutionsausdruck hängt von Ihrer XML-Struktur und Ihrer xpath-Abfrage ab.

Und Sie können sogar Zeilennummern auf jeder Zeile hinzufügen, wenn Sie nl hinzufügen

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

Welche

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

Das Problem ist, dass es auf konsistente Benennung Schema der Schlüssel (Eigenschaften) abhängt Wenn sie nicht 'key1, key2' sondern 'name, birthdate' sind, funktioniert das nicht. –

2

gibt Wenn es eine Option, versuchen xmlstarlet anstelle:

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