How to use the command xmlstarlet (with examples)
XMLStarlet is a command-line XML/XSLT toolkit that allows you to perform various operations on XML documents. With XMLStarlet, you can format XML, select nodes using XPath, edit XML files, and more.
Use case 1: Format an XML document and print to stdout
Code:
xmlstarlet format path/to/file.xml
Motivation: Formatting an XML document can improve readability and make it easier to work with. By using the format
command with XMLStarlet, you can reformat an XML document and print the formatted version to the standard output.
Explanation:
xmlstarlet
is the command itself.format
is the subcommand used to format the XML document.path/to/file.xml
is the path to the input XML file that you want to format.
Example output:
<?xml version="1.0"?>
<root>
<element attribute="value">Text</element>
</root>
Use case 2: XML document can also be piped from stdin
Code:
cat path/to/file.xml | xmlstarlet format
Motivation: Piping the input XML document from stdin
can be useful when you want to process XML data that doesn’t come from a file directly. This allows you to use XMLStarlet in combination with other commands to handle XML data in a more flexible way.
Explanation:
cat path/to/file.xml
reads the content of the XML file and sends it to the standard output.|
is the pipe operator, which takes the output from the previous command and sends it as input to the next command.xmlstarlet format
is the command that formats the XML data received fromstdin
.
Example output:
<?xml version="1.0"?>
<root>
<element attribute="value">Text</element>
</root>
Use case 3: Print all nodes that match a given XPath
Code:
xmlstarlet select --template --copy-of xpath path/to/file.xml
Motivation: When working with large XML documents, it can be helpful to extract specific nodes that match a given XPath expression. XMLStarlet’s select
command allows you to select nodes based on XPath and print them to the standard output.
Explanation:
xmlstarlet select
is the command used to select nodes from an XML document.--template
option is used to specify that the selected nodes should be processed using an XSLT template.--copy-of xpath
specifies the XPath expression to match the desired nodes.path/to/file.xml
is the path to the input XML file.
Example output:
<element attribute="value">
Text
</element>
Use case 4: Insert an attribute to all matching nodes, and print to stdout
Code:
xmlstarlet edit --insert xpath --type attr --name attribute_name --value attribute_value path/to/file.xml
Motivation: Sometimes, you may need to add attributes to specific nodes in an XML document. With XMLStarlet’s edit
command, you can insert attributes to all nodes that match a given XPath expression and print the modified XML to the standard output without modifying the original file.
Explanation:
xmlstarlet edit
is the command used to modify an XML document.--insert xpath
specifies the XPath expression to match the nodes where the attribute should be inserted.--type attr
indicates that an attribute should be inserted.--name attribute_name
specifies the name of the attribute to be inserted.--value attribute_value
specifies the value of the attribute to be inserted.path/to/file.xml
is the path to the input XML file.
Example output:
<root>
<element attribute="value">Text</element>
</root>
Use case 5: Update the value of all matching nodes in place
Code:
xmlstarlet edit --inplace --update xpath --value new_value file.xml
Motivation: Sometimes, you may need to update the values of specific nodes in an XML document and persist the changes in the original file. XMLStarlet’s edit
command with the --inplace
option allows you to modify an XML document directly.
Explanation:
xmlstarlet edit
is the command used to modify an XML document.--inplace
indicates that the modifications should be applied to the original file.--update xpath
specifies the XPath expression to match the nodes to be updated.--value new_value
specifies the new value to be set for the matching nodes.file.xml
is the path to the input XML file.
Example output: The XML document in file.xml
will be updated with the new value for the matching nodes.
Use case 6: Delete all matching nodes in place
Code:
xmlstarlet edit --inplace --delete xpath file.xml
Motivation: In certain scenarios, you may need to delete specific nodes from an XML document and persist the changes in the original file. With XMLStarlet’s edit
command and the --delete
option, you can remove nodes that match a given XPath expression directly from the XML file.
Explanation:
xmlstarlet edit
is the command used to modify an XML document.--inplace
indicates that the modifications should be applied to the original file.--delete xpath
specifies the XPath expression to match the nodes to be deleted.file.xml
is the path to the input XML file.
Example output: The XML document in file.xml
will be updated with the matching nodes removed.
Use case 7: Escape or unescape special XML characters in a given string
Code:
xmlstarlet [un]escape string
Motivation: XML documents require special characters to be escaped to ensure the document’s validity. XMLStarlet provides the [un]escape
command, which allows you to escape or unescape special XML characters in a given string.
Explanation:
xmlstarlet escape
is the command to escape special XML characters.xmlstarlet unescape
is the command to unescape special XML characters.string
is the string that you want to escape or unescape.
Example output:
&lt;root&gt;&lt;element attribute=&quot;value&quot;&gt;Text&lt;/element&gt;&lt;/root&gt;
Use case 8: List a given directory as XML
Code:
xmlstarlet ls path/to/directory
Motivation: XMLStarlet’s ls
command allows you to list the contents of a directory as XML. This can be useful when you want to generate an XML representation of a directory structure for further processing or analysis.
Explanation:
xmlstarlet ls
is the command to list a directory as XML.path/to/directory
is the path to the directory you want to list. If no argument is provided, the current directory will be listed.
Example output:
<dir name=".">
<file name="file1.txt"/>
<file name="file2.txt"/>
<dir name="subdir">
<file name="file3.txt"/>
</dir>
</dir>
Conclusion:
XMLStarlet is a powerful command-line XML/XSLT toolkit that provides various commands for working with XML documents. Whether you need to format XML, select nodes using XPath, edit XML files, or other XML-related tasks, XMLStarlet has got you covered. With the use cases demonstrated in this article, you can start leveraging XMLStarlet to manipulate and process XML data efficiently.