Search code examples
linuxxmlxmlstarletxmllint

getting data from xml file in bash (xmllint, xmlstarlet)


I have xml file with few item section. How i can extract data with xmllint or xmlstarlet tool.

I want get an /all/item/environment/os/vendor,name,version fields, but if /all/item/identifier=5555

I can find and output /all/item/identifier

xmlstarlet sel -t -v "/all/item/identifier[text() = '5555']"

but how output vendor,name,version for selected identifier?

i expect something like this 5555 vname1 vname1 123

sample xml below

<?xml version="1.0" encoding="utf-8"?>
<all>
...
<item>
    <identifier>5555</identifier>
    <name>Name</name>
    <description>desc</description>
    <i_software>
      <soft>
        <vendor>vname1</vendor>
        <name>vname1</name>
        <version>123</version>
        <types>
          <type>Something text</type>
        </types>
      </soft>
      <soft>
        <vendor>vname2</vendor>
        <name>vname2</name>
        <version>123</version>
        <types>
          <type>Something text</type>
        </types>
      </soft>
    </i_software>
    <environment>
      <os>
        <vendor>vname1</vendor>
        <name>vname1</name>
        <version>123</version>
      </os>
      <os>
        <vendor>vname1</vendor>
        <name>vname1</name>
        <version>123</version>
      </os>
    </environment>
    <qwe>
      <identifier>7777</identifier>
    </qwe>
    <idate>01.01.2099</idate>
    <identifiers>
      <identifier type="ABC" link="http://URL">ABCINFO</identifier>
    </identifiers>
    <other/>
</item>
<item>
...
</item>
</all>

Solution

  • Try using something like

    xml sel -t -m //item[identifier[.="5555"]]/environment/os -v ./vendor -nl -v ./name -nl -v ./version -nl
    

    on your actual xml and see if it works.