In most Linux and BSD, xmllint is delivered or very easy to install. Xmllint can parse and validate one or more XML files with output as reports. A version for Windows is available, too!
The tiny example XML file:
<?xml version="1.0" encoding="UTF-8"?>
<company>
<branch lang="de-DE">
<team id="011">
<name status="on">Develop</name>
<size>8</size>
</team>
</branch>
<branch lang="en-US">
<team id="021">
<name status="off">Sales</name>
<size>5</size>
</team>
<team id="022">
<name status="on">QA</name>
<size>2</size>
</team>
</branch>
<branch lang="de-CH">
<team id="031">
<name status="on">Develop</name>
<size>5</size>
</team>
<team id="032">
<name status="off">Consultant</name>
<size>3</size>
</team>
</branch>
</company>
Usage Examples:
# simple validation
$ xmllint --valid example.xml
# validation but without result tree
$ xmllint --valid --noout example.xml
# validation agains a specific DTD schema
$ xmllint --noout --dtdvalid <URL> example.xml
# again RelaxNG schema
$ xmllint --relaxng <schema> example.xml
# again WXS schema
$ xmllint --schema <schema> example.xml
# again schematron
$ xmllint --schematron <schema> example.xml
Query with xmllint
$ xmllint --shell example.xml
# with cat
/ > cat //name
-------
<name status="on">Develop</name>
-------
<name status="off">Sales</name>
-------
<name status="on">QA</name>
-------
<name status="on">Develop</name>
-------
<name status="off">Consultant</name>
# with cat and xpath
/ > cat //*[contains(*,"Consultant")]
-------
<team id="032">
<name status="off">Consultant</name>
<size>3</size>
</team>
# with grep
/ > grep QA
/company/branch[2]/team[2]/name : ta- 2 QA
# exit
/ > exit
XPath with xmllint
# by root element
$ xmllint --xpath //company example.xml
# by child elements
$ xmllint --xpath //name example.xml
# by specific child element
$ xmllint --xpath //branch[3] example.xml
# by last child element
$ xmllint --xpath '/company/branch[last()]' example.xml
# path expression
$ xmllint --xpath 'child::*/child::*/team' example.xml
# by attribute
$ xmllint --xpath '//branch[@lang="de-CH"]' example.xml