2009-12-11 7 views
15

Ich bin auf der Suche nach einer Möglichkeit, ein Element aus meinem XML extrahieren und drucken mit Xmlstarlet; wenn mein xml zum Beispiel istExtrahieren und Dumping Elemente mit Xmlstarlet

<?xml version="1.0" encoding="ISO-8859-1"?> 

<bookstore> 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

<book> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
</book> 

</bookstore> 

Ich möchte mit dem Preis Buch Element auszudrucken = 29.99 als:

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

ich die XPath-Abfrage zu verstehen, ein solches Element zu wählen (/ Buchhandlung/Buch [ Preis = 29.99]), aber Ich bin nicht in der Lage, es auszudrucken/stop auf stdout. Wenn ich die Option '-v' benutze und -v (.) Verwende, bekomme ich nicht die Ausgabe, wie ich will (mit allen Tags darin), ich bekomme nur die Textwerte. Es sollte eine Möglichkeit geben, das ausgewählte Element einfach so abzulegen, wie es ist, und genau das suche ich.

Vielen Dank im Voraus.

Antwort

15

Mit der „-c“ (Kopie) Option sollte erreichen, was Sie wollen:

xmlstarlet sel -t -c "/bookstore/book[price=29.99]" books.xml 

<book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
</book> 

Sie können die XSLT in xmlstarlet intern erzeugt beobachten durch die globale Hinzufügen von „C“ -Schalter nach " sel ". Dies zeigt, wie die Kopieroption führt zu einem Xslt copy-of-Konstrukt:

... 
<xsl:template name="t1"> 
    <xsl:copy-of select="/bookstore/book[price=29.99]"/> 
</xsl:template> 
... 

Dies führt zu einem Namensraum-Knoten, Child-Knoten und Attribute Knoten enthalten ist, vgl die XSLT-Spezifikation (see w3schools summary).

+0

Danke dafür, es hat funktioniert! – shrijeet

+0

Musste eine Anzahl von Zeichen ändern, um das Mindeständerungslimit von SO 6 Zeichen zu umgehen. würde nicht für mich arbeiten, wenn ich das @ vor dem Attribut, d. h. @ price = 29.99 statt Preis = 29.99 setzen –

+0

Danke .. Ich verbrachte einen fast einen Monat, der nach diesem c Schalter sucht. – ifelsemonkey

Verwandte Themen