I am trying to extract the value of the 'Value' node, where the 'Key' node is 'state' within a bash shell:
<FrontendStatus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" serializerVersion="1.1">
<script/>
<State>
<String>
...
...
</String>
<String>
...
...
</String>
<String>
<Key>state</Key>
<Value>WatchingLiveTV</Value>
</String>
<String>
<Key>studiolevels</Key>
<Value>1</Value>
</String>
<String>
...
...
</String>
<String>
...
...
</String>
</State>
</FrontendStatus>
I can extract the value if I reference the node directly:
$ xmlstarlet sel -t -m '/FrontendStatus[1]/State[1]/String[31]' -v Value <status.xml
WatchingLiveTV
But I would like to select it by the value of the 'Key' node instead
This XPath will select
Value
of aState
based on itsKey
equallingstate
:Or, in xmlstarlet:
Will return
WatchingLiveTV
as requested.I was able to find that node using the following XPath:
Which will return:
Note you could also use:
Which is slightly smaller.
To select the Value element and parent/siblings, you could use:
Which returns:
Edit
I just re-read your original question. You would like to select the XML based on the value of the
Key
node. You can do this using the above, but changing the predicate fromValue
toKey
:@kjhughes has put this into the syntax format you're after.
I hope that helps.