0

i would like to parse the below xml text in bash script.

<os name="RedHat" os_version="6">
<package_manager type="name">rpm</package_manager>
<multipath_package_check type="command">rpm -qa | grep device-mapper-multipath</multipath_package_check>
<mpath_service_enable type="command">chkconfig multipathd on</mpath_service_enable>
<mpath_service_restart type="command">service multipathd restart</mpath_service_restart>
</os>

For example, i need to have functions like below to return the text if element attributes match the arguments.

get_package_manager "RedHat" "6" 

should return "rpm"

get_multipath_package_check "RedHat" "6" 

should return "rpm -qa | grep device-mapper-multipath"

appreciate any help.

skrish
  • 1
  • Don't try to parse XML using tools like `bash`, `sed` or `awk`. That way lies madness. Use something XML-aware, like `xmlstarlet`. – Michael Vehrs May 20 '16 at 05:33

1 Answers1

0

Some "xml parsing" are easier to do with a flat representation of XML, using the xml2 (apt-get install xml2) program.

Typically:

$ xml2 < test.xml | grep package_manager= | cut -d= -f2
rpm

$ xml2 < test.xml | grep multipath_package_check= | cut -d= -f2
rpm -qa | grep device-mapper-multipath

But it won't solve anything. For the problem you can't easily solve with xml2, you may try expressing your query using xpath and use any xpath tool available in CLI like xmllint:

$ xmllint --xpath '/os[@name="RedHat" and @os_version="6"]/package_manager/text()' test.xml
rpm

$ xmllint --xpath '/os[@name="RedHat" and @os_version="6"]/multipath_package_check[@type="command"]/text()' test.xml 
rpm -qa | grep device-mapper-multipath
Julien Palard
  • 8,736
  • 2
  • 37
  • 44