Using XmlPath in REST Assured for XML Response Validation

When working with RESTful APIs, you may encounter responses in XML format, and it's essential to validate or extract specific data from those responses. In REST Assured, XmlPath is a powerful utility that allows you to navigate and extract values from XML responses. This makes it an excellent tool for API testing when dealing with XML-based data.

In this blog post, we’ll explore how to use XmlPath in REST Assured for XML response parsing, extracting values, and performing assertions.

What is XmlPath?

XmlPath is part of REST Assured, a popular Java library used for testing RESTful web services. It is designed to simplify XML response handling by allowing you to parse XML responses and perform XPath-like queries to extract values. XmlPath provides a straightforward way to extract values from XML using simple methods like get(), getString(), getInt(), and others.

Setting Up REST Assured for XML Testing

Before we begin using XmlPath, ensure that you have REST Assured set up in your project. You can add it to your project using Maven by including the following dependency in your pom.xml:

<dependency>

    <groupId>io.rest-assured</groupId>

    <artifactId>rest-assured</artifactId>

    <version>5.2.0</version>  <!-- Use the latest version -->

    <scope>test</scope>

</dependency>

For XML processing, REST Assured uses the XmlPath class in combination with the Response object. Below is an example of how to send a request and parse an XML response.

Sending a Request and Extracting XML Response

Let’s assume we have an API that returns an XML response. Here’s an example of how you can use REST Assured to send a GET request and extract data from the XML response using XmlPath.

import io.restassured.RestAssured;

import io.restassured.path.xml.XmlPath;

import io.restassured.response.Response;

import org.junit.Test;


public class XmlPathExample {


    @Test

    public void testXmlResponse() {

        // Send GET request

        Response response = RestAssured

                .given()

                .baseUri("https://example.com/api")

                .basePath("/users")

                .get();


        // Extract XML response body

        String xmlResponse = response.getBody().asString();

        System.out.println("XML Response: " + xmlResponse);


        // Parse the XML response using XmlPath

        XmlPath xmlPath = new XmlPath().using(new io.restassured.parsing.XMLPathConfig(io.restassured.parsing.Parser.XML));


        // Example: Extracting the value of a specific element

        String userName = xmlPath.parse(xmlResponse).getString("users.user[0].name");

        System.out.println("User Name: " + userName);


        // Perform an assertion on the extracted value

        assert userName.equals("John Doe");

    }

}

In the above example:

  • We use RestAssured.given() to set up the base URI and path for the API request.
  • We call .get() to make the GET request.
  • The response body is extracted as a string using response.getBody().asString().
  • XmlPath is used to parse the XML response and navigate through it using XPath expressions.

Extracting Data from XML Responses

Let’s dive deeper into how you can extract various data types from XML responses using XmlPath methods.

1. Extracting a String

If you want to extract a simple string value from the XML, you can use the getString() method. For example, to extract the name of the first user:

String userName = xmlPath.getString("users.user[0].name");

2. Extracting an Integer

You can also extract numerical values using the getInt() method. For instance, if you want to extract the age of a user:

int userAge = xmlPath.getInt("users.user[0].age");

3. Extracting a List of Values

XmlPath allows you to extract lists of values using the getList() method. This is particularly useful when you have multiple occurrences of an element in your XML response. For example:

List<String> userNames = xmlPath.getList("users.user.name");

System.out.println(userNames);

4. Extracting a Nested Element

If your XML contains nested elements, you can use dot notation to navigate through the hierarchy. For example, to extract the address of a user:

String userAddress = xmlPath.getString("users.user[0].address.city");

System.out.println(userAddress);

XPath in XmlPath

XmlPath supports XPath-like syntax, which makes it easier to query XML elements. Some basic examples of XPath queries in XmlPath include:

  • users.user[0].name: Extracts the name of the first user.
  • users.user.name: Extracts all user names.
  • users.user[1].address.city: Extracts the city of the second user’s address.

Performing Assertions

Once you have extracted data from the XML response, you can perform assertions to validate the data. This is an essential part of API testing. Using REST Assured, assertions can be done as follows:

response.then().assertThat()

        .body("users.user[0].name", equalTo("John Doe"))

        .body("users.user[0].age", greaterThan(18));

Followers