Skip to main content

xml resource

Use the xml Chef InSpec audit resource to test data in an XML file.

Availability

Install

This resource is distributed with Chef InSpec and is automatically available for use.

Version

This resource first became available in v1.37.6 of InSpec.

Syntax

An xml resource block declares the data to be tested. Assume the following XML file:

<root>
  <name>hello</name>
  <meta>
    <creator>John Doe</creator>
  </meta>
  <array>
    <element>one</element>
    <element>two</element>
  </array>
  <array>
    <element value="one"></element>
    <element value="two"></element>
  </array>
</root>

This file can be queried for elements using:

describe xml('/path/to/name.xml') do
  its('root/name') { should eq ['hello'] }
  its('root/meta/creator') { should eq ['John Doe'] }
  its('root/array[2]/element') { should eq ['two'] }
end

This file can be queried for attributes using:

describe xml('/path/to/name.xml') do
  its('root/array[2]/element/@value') { should eq ['one', 'two'] }
  its('root/array[2]/element/attribute::value') { should eq ['one', 'two'] }
  its('root/array[2]/element[2]/attribute::value') { should eq ['two'] }
  its('count(//*)') { should eq [42] }
  its('boolean(root/array[2]/element[2]/@valid)') { should eq [false] }
end

where

  • root/name and root/array[2]/element/@value is an XPath expression
  • should eq ['foo'] tests a value of root/name as read from an XML file versus the value declared in the test

In the above example, you see the use of @ and attribute:: which are both methods of fetching attributes.

In the event the path contains an element which contains periods, the alternate syntax can be used:

its(['root/name.with.a.period']) { should cmp 'so_many_dots' }

Examples

The following examples show how to use this Chef InSpec audit resource.

Test an AppPool’s presence in an applicationHost.config file or the default site under applicationHost.sites

describe xml('applicationHost.config') do
  # using the alternate syntax as described above because of the . in the key name
  its(['configuration/system.applicationHost/applicationPools/add@name']) { should contain('my_pool') }
end

describe xml('applicationHost.sites') do
  its('site[@name="Default Web Site"]/application/virtualDirectory/@path') { should eq ['/'] }
end

Matchers

For a full list of available matchers, see our Universal Matchers page.

This resource has the following special matchers.

name

The name matcher tests the value of name as read from a JSON file versus the value declared in the test:

its('name') { should eq 'foo' }
Edit this page on GitHub

Thank you for your feedback!

×