Tikxml
Retrofit을 사용할 시 보통 대부분 응답 결과가 JSON으로 오기 때문에 GsonConverter를 사용합니다.
하지만 국내 일부 공공데이터나 오래된 데이터는 XML 결과만 제공합니다.
과거에는 SimpleXML 라이브러리를 활용하여 XML 파싱이 가능했지만 현재는 deprecated된 상태입니다.
따라서, 같은 기능을 하는 XML Parser인 Tikxml을 주로 사용합니다.
GitHub - Tickaroo/tikxml: Modern XML Parser for Android
Modern XML Parser for Android. Contribute to Tickaroo/tikxml development by creating an account on GitHub.
github.com
RSS (Really Simple Syndication)
RSS는 뉴스나 블로그 사이트에서 주로 사용하는 XML 기반의 콘텐츠 표현 방식입니다.
RSS는 웹 사이트에 새로운 콘텐츠가 발행되면 사용자가 직접 방문하지 않고도 알 수 있게 제안되었습니다.
즉, RSS를 사용하면 사용자는 여러 웹 사이트를 돌아다니지 않아도 신규로 만들어진 콘텐츠를 편하게 즐길 수 있습니다.
RSS - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. RSS(Rich Site Summary)는 뉴스나 블로그 사이트에서 주로 사용하는 콘텐츠 표현 방식이다. 웹 사이트 관리자는 RSS 형식으로 웹 사이트 내용을 보여 준다. 이 정보를
ko.wikipedia.org
RSS의 규격
다음은 위키백과에 기재되어 있는 RSS의 규격입니다.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>채널 제목</title>
<link>채널 주소/</link>
<description>채널 설명</description>
<item>
<title>아이템 제목</title>
<link>아이템 주소</link>
<description>글 내용 전체(또는 일부)</description>
<pubDate>발행일자</pubDate>
<guid>아이템 주소</guid>
</item>
</channel>
</rss>
Tikxml로 RSS 파싱하기
1. build.gradle에 의존성 추가
Tickxml을 사용하기 위해서 build.gradle에 Tickxml 라이브러리를 추가합니다.
implementation 'com.tickaroo.tikxml:annotation:0.8.13'
implementation 'com.tickaroo.tikxml:core:0.8.13'
implementation 'com.tickaroo.tikxml:retrofit-converter:0.8.13'
kapt 'com.tickaroo.tikxml:processor:0.8.13'
2. RetrofitClient에 Converter 추가
여기서 exceptionOnUnreadXml(false)를 사용한 이유는 원하지 않는 데이터는 제외하기 위해서입니다.
object RetrofitClient {
private const val BASE_URL = "https://.../"
val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(
TikXmlConverterFactory.create(
TikXml.Builder()
.exceptionOnUnreadXml(false)
.build()
)
).build()
}
3. 데이터 클래스 작성
RSS의 규격을 참고하여 해당 데이터에 맞게 data class를 작성합니다.
@Xml은 하위 Element를 감싸는 어노테이션입니다.
@Element는 하위 PropertyElement를 감싸는 어노테이션입니다.
즉, @Element는 딸린 자식이 있는 경우에 사용하고, @PropertyElement는 없는 경우에 사용합니다.
@Xml(name = "rss")
data class NewsRss(
@Element(name = "channel")
val channel: RssChannel
)
@Xml(name = "channel")
data class RssChannel(
@PropertyElement(name = "title")
val title: String,
@Element(name = "item")
val items: List<NewsItem>? = null
)
@Xml(name = "item")
data class NewsItem(
@PropertyElement(name = "title")
val title: String? = null,
@PropertyElement(name = "link")
val link: String? = null
)
4. 실제로 적용
다음은 RSS Feed에서 데이터를 가져오는 함수입니다.
RSS Feed는 여러 가지 정보들을 분류해서 사용자가 취향에 맞는 형태로 사용할 수 있게 해줍니다.
interface NewsService {
@GET("rss?hl=ko&gl=KR&ceid=KR:ko")
fun mainFeed(): Call<NewsRss>
}
'안드로이드 > 활용' 카테고리의 다른 글
[Android] Glide 사용하기 (0) | 2023.08.22 |
---|---|
[Android] Jsoup으로 HTML 파싱하기 (0) | 2023.08.21 |
[Android] Retrofit 사용하기 (0) | 2023.08.18 |
[Android] HttpUrlConnection과 OkHttp (0) | 2023.08.18 |
[Android] Socket 통신 (0) | 2023.08.17 |