Issue
<?xml version="1.0" encoding="utf-8"??>
<resources>
<data id="V701">
<string name="MSG_V701_ID">V701</string>
<string name="MSG_V701_TITLE">abc</string>
<string name="MSG_V701_BODY">This title is currently unable</string>
</data>
<data id="V702">
<string name="MSG_V702_ID">V702</string>
<string name="MSG_V702_TITLE">Play</string>
<string name="MSG_V702_BODY">This title is currently unable to play</string>
Using this xml i want to find values of all tags related to particular id
for eg id="V701" V701 abc This title is currently unable
for id="V702" V702 Play This title is currently unable to play i want to use this in bash script so please print output one per line
Solution
You are generally better off using a tool that understands XML to parse an XML file, rather than trying to parse it using things like sed
or awk
. For example, the xmllint
command has a --xpath
option that you can use to extract information from an XML file:
$ ID=V702
$ result=$(xmllint --xpath "//data[@id='$ID']" data.xml)
$ echo "$result"
<data id="V702">
<string name="MSG_V702_ID">V702</string>
<string name="MSG_V702_TITLE">Play</string>
<string name="MSG_V702_BODY">This title is currently unable to play</string>
</data>
Or even:
$ result=$(xmllint --xpath "//data[@id='$ID']//text()" data.xml)
$ echo "$result"
V702
Play
This title is currently unable to play
If you want individual strings, you can do something like this:
title=$(xmllint --xpath "//data[@id='$ID']/string[@name='MSG_${ID}_TITLE']/text()" data.xml)
body=$(xmllint --xpath "//data[@id='$ID']/string[@name='MSG_${ID}_BODY']/text()" data.xml)
Answered By - larsks Answer Checked By - Willingham (WPSolving Volunteer)