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のリファレンスを見ながらやるのが一番いいと思います。