Retrofit — How to Integrate XML Converter

This post is all about how to integrate an XML converter with Retrofit. Before we go on, let's have a look at the other articles in the series of Retrofit posts.


Retrofit Series Overview

  1. Getting Started and Creating an Android Client
  2. Retrofit 2 — Basics of API Description
  3. Retrofit 2 — Creating a Sustainable Android Client
  4. Synchronous and Asynchronous Requests
  5. Send Objects in Request Body
  6. Add Custom Request Header
  7. Retrofit 2 — Manage Request Headers in OkHttp Interceptor
  8. Retrofit 2 — Dynamic Request Headers with @HeaderMap
  9. Multiple Query Parameters of Same Name
  10. Optional Query Parameters
  11. Using the Log Level to Debug Requests
  12. Retrofit 2 — Log Requests and Responses
  13. Retrofit 2 — Enable Logging for Development Builds Only
  14. How to Upload Files to Server
  15. Retrofit 2 — How to Upload Files to Server
  16. Retrofit 2 — How to Upload Multiple Files to Server
  17. Retrofit 2 — Passing Multiple Parts Along a File with @PartMap
  18. Basic Authentication on Android
  19. Token Authentication on Android
  20. OAuth on Android
  21. Retrofit 2 — Hawk Authentication on Android
  22. How to Refresh an Access Token
  23. Retrofit 2 — Upgrade Guide from 1.9
  24. Retrofit 2 — Simple Error Handling
  25. How to use OkHttp 3 with Retrofit 1
  26. Send Data Form-Urlencoded
  27. Send Data Form-Urlencoded Using FieldMap
  28. Retrofit 2 — How to Add Query Parameters to Every Request
  29. Retrofit 2 — Add Multiple Query Parameter With QueryMap
  30. Retrofit 2 — How to Use Dynamic Urls for Requests
  31. Retrofit 2 — URL Handling, Resolution and Parsing
  32. Retrofit 2 — Constant, Default and Logic Values for POST and PUT Requests
  33. Retrofit 2 — How to Download Files from Server
  34. Retrofit 2 — Cancel Requests
  35. Retrofit 2 — Reuse and Analyze Requests
  36. Retrofit 2 — How to Change API Base Url at Runtime
  37. Optional Path Parameters
  38. Retrofit 2 — How to Send Plain Text Request Body
  39. Retrofit 2 — Pagination Using Query Parameter
  40. Retrofit 2 — Pagination Using Link Header and Dynamic Urls (Like GitHub)
  41. Retrofit 2 — Pagination Using Range Header Fields (Like Heroku)
  42. How to Integrate XML Converter
  43. Define a Custom Response Converter
  44. Retrofit 2 — Introduction to (Multiple) Converters
  45. Retrofit 2 — Adding & Customizing the Gson Converter
  46. Retrofit 2 — Implementing Custom Converters
  47. Retrofit 2 — Basics of Mocking Server Responses
  48. Retrofit 2 — Customizing Network Behavior of Mocked Server Responses (soon)
  49. Java Basics for Retrofit — Callbacks (soon)
  50. Java Basics for Retrofit — Annotations (soon)
  51. Java Basics for Retrofit — Fluent Interface with Builders (soon)

Define XML Converter

We assume you’re familiar with the basics of Retrofit and you know how to configure Retrofits RestAdapter (Retrofit in Retrofit 2). If not, please have a look at the getting started post in this series.

Here, we’ll show you how to integrate an XML converter to map HTTP responses from XML to Java objects.

Define Gradle Dependency

First stop is the build.gradle file. The Retrofit project already has an XML converter available which you need to add to your project as a peer-dependency. Have a look at our previous post about how to create or define your custom response converter if you want to know more about existing converters for Retrofit.

Here we go, define the dependency in your build.gradle.

Retrofit 1.9

dependencies {  
    // Retrofit XML converter (Simple)
    compile 'com.squareup.retrofit:converter-simplexml:1.9.0'
}

Retrofit 2

dependencies {  
    // Retrofit XML converter (Simple)
    compile 'com.squareup.retrofit2:converter-simplexml:2.1.0'
}

Once you added the dependency for the SimpleXML converter to your build.gradle file, sync the project and wait for Android Studio to finish the process. Afterwards, proceed with the next steps described in the section below :)

XMLConverter feat. RestAdapter/Retrofit

Now, we have to define the SimpleXMLConverter as converter for the RestAdapter (Retrofit in Retrofit 2).

Retrofit 1.9

RestAdapter adapter = new RestAdapter.Builder()  
    .setClient(new OkClient(new OkHttpClient())
    .setEndpoint(yourBaseUrl)
    .setConverter(new SimpleXMLConverter())
    .build();

Just pass the new SimpleXMLConverter() constructor to the .setConverter() method to override the default converter (GSON).


Retrofit 2

Retrofit retrofit = new Retrofit.Builder()  
    .baseUrl(API_BASE_URL)
    .client(new OkHttpClient())
    .addConverterFactory(SimpleXmlConverterFactory.create())
    .build();

The handling of response converters changed in Retrofit 2. You don’t override existing converters. That results in the possibility to define multiple converters for your Retrofit instance. Internally, Retrofit will try to parse the response with the first added converter. If that fails, it will proceed with the next one, and so on …

Objects Love Annotations

Retrofit will map your XML response to Java objects, doesn’t matter which XML converter you’re using. Therefore, we need to annotate the Java objects for correct tag to property mapping.

We’ll use the Task class below and add annotations to map the corresponding tasks.xml file.

tasks.xml

This XML file does not appear to have any style information associated with it. The document tree is shown below.

<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">  
    <task>
        <id link="http://url-to-link.com/task-id">1</id>
        <title>Retrofit XML Converter Blog Post</title>
        <description>Write blog post: XML Converter with Retrofit</description>
        <language>de-de</language>
    </task>
</rss>  

Task

@Root(name = "task")
public class Task {  
    @Element(name = "id")
    private long id;

    @Element(name = "title")
    private String title;

    @Element(name = "description")
    private String description;

    @Attribute(required = false)
    private String link;

    public Task() {}
}

The annotations define the element name which gets mapped to the class property. Within the example, all elements have the same name in the XML file and the Java class. For sure, you can use a different naming and just put the element name to the @Element annotation.

That’s it. Just go ahead and make your request :)

Feel free to contact us @futurestud_io if you run into any problem. We’re happy to help.


Additional Resources


Explore the Library

Find interesting tutorials and solutions for your problems.

Miscellaneous