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種類になります。
BlogDetailEntity
@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に記載しないといけなくなるので、注意です。
BlogEntity
@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のリファレンスを見ながらやるのが一番いいと思います。