Learn how to use xmlstarlet to update value in XML file and handle complex XML payloads efficiently in your shell scripts
If you work in IT or even if you think about IT as one of your main hobbies, you have been written a shell script at some point. If you also work on the business’s operation side, this can be your daily task. To create, maintain, or to upgrade the existing process.
Nowadays, it is more usual to interact with external systems that use payload in XML files or even configuration files written using this format.
Native shell script does not provide an easy way to do that or support libraries to handle that as we can in modern programming languages like Python, Java, or Go. So, probably you have found yourself writing code to parse this kind of payload. But this is not the only way to do that, and we can (and we should!) leverage existing utilities to do this job for us.
I could not find a better way to explain what xmlstarlet does than the definition the owners do in their source code repository:
XMLStarlet is a command line XML toolkit which can be used to transform,
query, validate, and edit XML documents and files using simple set of shell
commands in similar way it is done for plain text files using grep/sed/awk/
So, xmlstarlet provides all the power to do anything you can imagine when dealing with XML similarly, as this was plain text files.
The installation process for this utility is quite easy and depends on the operating system you are using. I will assume that most of the shell scripts are with a Unix machine target in mind. Installing this is quite easy as most of the package repositories have a version of this tool.
So, if you are using an apt-based system, you need to execute the command:
sudo apt-get install xmlstarlet
If you are using another platform, do not worry because they have available versions for all the most used operating systems and platforms, as you can see in the link below:
As soon as we have this software installed, the first thing we will do is launch it to see the options available.
XMLStarlet Toolkit: Command line utilities for XML Usage: D:\Data\Downloads\xmlstarlet-1.6.1-win32\xmlstarlet-1.6.1\xmlstarlet.exe [<options>] <command> [<cmd-options>] where <command> is one of: ed (or edit) - Edit/Update XML document(s) sel (or select) - Select data or query XML document(s) (XPATH, etc) tr (or transform) - Transform XML document(s) using XSLT val (or validate) - Validate XML document(s) (well-formed/DTD/XSD/RelaxNG) fo (or format) - Format XML document(s) el (or elements) - Display element structure of XML document c14n (or canonic) - XML canonicalization ls (or list) - List directory as XML esc (or escape) - Escape special XML characters unesc (or unescape) - Unescape special XML characters pyx (or xmln) - Convert XML into PYX format (based on ESIS - ISO 8879) p2x (or depyx) - Convert PYX into XML <options> are: -q or --quiet - no error output --doc-namespace - extract namespace bindings from input doc (default) --no-doc-namespace - don't extract namespace bindings from input doc --version - show version --help - show help Wherever file name mentioned in command help it is assumed that URL can be used instead as well. Type: xmlstarlet <command> --help <ENTER> for command help
So the first thing we need to decide is which command we need to use, and these commands are one-to-one related to the action that we like to perform. I will focus on the main commands in this post, but as you can see, this covers from select values an XML, update it or even validate it.
Use case 1: Selecting a value.
We are going to start with the most simple use case try to select a value from an XML (file.xml) like this:
<root> <object1 name="attribute_name">value in XML</object1>
So, we are going to start with the most simple command:
./xmlstarlet sel -t -v "/root/object1" ./file.xml
value in XML
This provides the value inside the object1 element, using -t to define a new template and -v to specify the value-of sentence. If now, we would like to get the attribute value, we can do it pretty much similar to the previous command:
./xmlstarlet sel -t -v "/root/object1/@name" ./file.xml
Use case 2: Updating value.
Now, we will follow the other approach based on the same file. We will update the value of the object1 element to set the text “updated text”.
To do that, we execute the following command:
./xmlstarlet ed -u "/root/object1" -v "updated text" ./file.xml
<?xml version="1.0"?> <root> <object1 name="attribute_name">updated text</object1> </root>
xmlstarlet will provide us all the options to manage something complicated as there are XML and do all the tasks that you can imagine simply without needed to code yourself all the parsing logic. I hope you are a happier developer since now when you need to manage an XML inside a shell script.