Using xmllint for Interactive xml file explore and update

Download example xml

mkdir xml
cd xml/
wget https://www.w3schools.com/xml/cd_catalog.xml
xmllint --shell cd_catalog.xml

Example xml fragment

cd_catalog.xml
<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
  <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
  </CD>
...
  <CD>
    <TITLE>Unchain my heart</TITLE>
    <ARTIST>Joe Cocker</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>EMI</COMPANY>
    <PRICE>8.20</PRICE>
    <YEAR>1987</YEAR>
  </CD>
</CATALOG>

Search and update XML using xmllint interactive shell

xmllint --shell cd_catalog.xml

Search in XML

grep heart

/CATALOG/CD[2]/TITLE : tan 15 Hide your heart
/CATALOG/CD[26]/TITLE : t-- 16 Unchain my heart


Display XM key

cat /CATALOG/CD[26]/TITLE


 -------
<TITLE>Unchain my heart</TITLE>


Display XML Section

cat /CATALOG/CD[26]


<CD>
    <TITLE>Unchain my heart</TITLE>
    <ARTIST>Joe Cocker</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>EMI</COMPANY>
    <PRICE>8.20</PRICE>
    <YEAR>1987</YEAR>
  </CD>


Update XML Key

xmllint shell commands

cd /CATALOG/CD[26]/TITLE
set New test title name
save
quit

output

/ > cd /CATALOG/CD[26]/TITLE
TITLE > set New test title name
TITLE > save
TITLE > quit

check results

cat cd_catalog.xml |tail -n 10

updated xml fragment

  </CD>
  <CD>
    <TITLE>New test title name</TITLE>
    <ARTIST>Joe Cocker</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>EMI</COMPANY>
    <PRICE>8.20</PRICE>
    <YEAR>1987</YEAR>
  </CD>
</CATALOG>


Bash one line commands to update XML using xmllint shell feature


#rm cd_catalog.xml
wget https://www.w3schools.com/xml/cd_catalog.xml
echo -e "grep heart"|xmllint --shell cd_catalog.xml
/ > /CATALOG/CD[2]/TITLE : tan       15 Hide your heart
/CATALOG/CD[26]/TITLE : t--       16 Unchain my heart

Update single key by path

echo -e "cd /CATALOG/CD[26]/TITLE\nset New test title name\nsave"|xmllint --shell cd_catalog.xml

Display

echo -e "cat /CATALOG/CD[26]/TITLE"|xmllint --shell cd_catalog.xml
/ >  -------
<TITLE>New test title name</TITLE>


Display section

echo -e "cat /CATALOG/CD[26]"|xmllint --shell cd_catalog.xml
/ >  -------
<CD>
    <TITLE>New test title name</TITLE>
    <ARTIST>Joe Cocker</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>EMI</COMPANY>
    <PRICE>8.20</PRICE>
    <YEAR>1987</YEAR>
  </CD>
  • No labels