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
Search
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>