Linux Bash XMLLINT with XPATH
My favorite is xmlstarlet because it seems to be more powerful than xmllint:
xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml
how best to target a specific and then drill down to its child element
The correct XPath expression to do this is:
/resources/item[@id="index.php"]/description/text()
In plain English: Start from the document node, to the document element resources
, on to its child item
, but only if the value of the id
attribute is "index.php", on to its child description
and retrieve its textual value.
I use xmllint to validate XML documents, but never for path expressions. In a bash shell (at least with Mac OS) there is an even simpler tool for evaluating XPath expressions, called "xpath":
$ xpath en.xml '/resources/item[@id="index.php"]/description/text()'
Then, the following result is obtained:
Found 1 nodes:
-- NODE --
DESCRIPTION
If you still prefer xmllint, use it in the following way:
$ xmllint --xpath '/resources/item[@id="index.php"]/description/text()' en.xml > result.txt
By default, --xpath
implies --noout
, which prevents xmllint from outputting the input XML file. To make the output more readable, I redirect the output to a file.
$ cat result.txt
DESCRIPTION