くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

Retrofitでxmlの要素の値を取得する

Retrofitでxmlの要素を取得するためにEntityを定義しました。 初めて行うと意外に苦戦することが多いので、まとめます。

今回対象のxmlは以下になります。

<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title>××××××××××××××</title>
    <link>×××××××××××××××</link>
    <description>××××××××</description>
    <lastBuildDate>××××××</lastBuildDate>
 
        // itemがリストになっている
        <item>
          <title>××××××××××××</title>
          <link>×××××××××××××</link>          
      <description>×××××××</description>          
     <pubDate>××××××××××××</pubDate>   
        </item>
   </channel>

今回作成したEntityは2種類になります。

@Root(name = "item", strict = false)
class BlogDetailEntity {

    @set:Element(name = "title", required = false)
    @get:Element(name = "title", required = false)
    var title: String? = null

    @set:Element(name = "link", required = false)
    @get:Element(name = "link", required = false)
    var link: String? = null

    @set:Element(name = "date", required = false)
    @get:Element(name = "date", required = false)
    var date: String? = null

    @set:Element(name = "description", required = false)
    @get:Element(name = "description", required = false)
    var description: String? = null
}

BlogDetailEntityはのリストの詳細を表しています。 @Rootでitemを指定することにより、<item>の子要素を取得しています。 name=でタグの名前を指定することで取得できます。 required=は必須チェックを行っています。 また、strict=falseを指定しないと、全ての要素をEntityに記載しないといけなくなるので、注意です。

@Root(name= "rss", strict = false)
class BlogEntity {

    @set:Element(name = "title", required = true)
    @get:Element(name = "title", required = true)
    var title: String? = ""

    @set:Element(name = "lastBuildDate", required = true)
    @get:Element(name = "lastBuildDate", required = true)
    var lastBuildDate: String? = ""

    @set:ElementList(entry = "item", inline = true)
    @get:ElementList(entry = "item", inline = true)
    var articleEntities: List<BlogDetailEntity>? = null

    @set:Element(name = "channel")
    @get:Element(name = "channel")
    var channel: String? = ""
}

こちらではrss配下の要素を取得しています。 itemはリスト型でnameではなく、entryで指定しています。

実際にやってみて意外と苦戦しました。 simplexmlのリファレンスを見ながらやるのが一番いいと思います。