Notice
Recent Posts
Recent Comments
Link
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Android
- coroutine
- 학습지
- blog
- suspend
- 코틀린
- rxjava
- ai
- n3문법
- 책추천
- pullrequest
- posting
- PR
- Kotlin
- CustomTab
- 진짜일본어
- GIT
- 일본어기초
- KotlinInAction
- 책리뷰
- errorhandling
- 일본어문법
- 안드로이드
- 인공지능
- 진짜학습지후기
- jlpt
- 진짜학습지
- github
- webflux
- androidstudio
Archives
코딩하는 개굴이
[Android] XmlPullParser를 이용한 XML 처리 (feat. JAXB) 본문
반응형
JAXB
JAXB 는 (Java Architecture for XML Binding) Java Object 를 XML 로 직렬화하고, XML 을 JAVA Object 로 역직렬화 해주는 JAVA API 로, JDK6~9 은 내장되어있으므로 라이브러리를 추가할 필요가 없다.
marshalling: JAXB 에서 JAVA 객체를 XML 로 변환하는 작업을 말하며, JAXB 는 이를 위해 Marshall 클래스를 제공한다.
일반적인 JAVA 코드 하에서는 아래와 같이 사용할 수 있는데,
try {
JAXBContext context = JAXBContext.newInstance(Books.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
Books books = new Books();
books.add(new Book(1L, "Head First Java",
new Author(1L, "Bert")));
books.add(new Book(2L, "Thinking in Java",
new Author(2L, "Bruce")));
marshaller.marshal(books, sw);
marshaller.marshal(books, sw);
System.out.println(sw);
} catch (JAXBException ex) {
ex.printStackTrace();
}
아쉽게도 JAXB 는 안드로이드에서는 지원하지 않는다.
(그러나, XML 파싱을 하여 직접 객체를 만들거나 관련 코드를 직접 생성하는 등의 방법은 존재한다.)
XmlPullParser
Android Developers 에서는 안드로이드에서 효율적이고 유지관리가 쉽게 설계된, XmlPullParser 를 사용해 XML 파싱하도록 가이드 하고 있다.
XmlPullParser 는 두가지 인터페이스를 제공하고 있는데, 아래와 같다.
- XmlPullParserFactory.newPullParser가 만드는 KXmlParser
- Xml.newPullParser()가 만드는 ExpatPullParser
안드로이드는 그 중, Xml.newPullParser 를 사용하도록 권장하고 있다.
<!--test.xml-->
<current>
<city id="1835848" name="Seoul">
<coord lon="126.98" lat="37.57"/>
<country>KR</country>
<sun rise="2017-03-28T21:21:49" set="2017-03-29T09:52:15"/>
</city>
<temperature value="11.01" min="7" max="13" unit="metric"/>
</current>
try {
val parser = Xml.newPullParser()
// assets 폴더안에 있는 XML 파일을 열어 InputStream 객체 생성
val inputStream: InputStream = assets.open("test.xml")
// inputStream 지정
parser.setInput(inputStream, null)
// getEventType() 메서드를 사용해 이벤트 타입을 얻어오는데
// 처음으로 호출되므로 START_DOCUMENT가 호출
var eventType = parser.eventType
var done = false
// eventType이 End_Document가 아니고 done이 false일 경우 반복
while(eventType != XmlPullParser.END_DOCUMENT) {
// 이름을 저장하기 위한 변수
var name: String? = null
// eventType이 START_TAG인 경우
if(eventType == XmlPullParser.START_TAG) {
// getName() 메서드를 사용해 현재 요소(태그)의 이름을 반환
name = parser.name
// 태그의 이름이 city인 경우
if(name == "city") {
// getAttributeValue를 사용해 첫 번째 매개변수 및
// 두 번째 매개변수로 식별된 특성 값 획득
cityView.text = parser.getAttributeValue(null, "name")
} else if(name == "temperature") {
temperatureView.text = parser.getAttributeValue(null, "value")
}
}
// 다음 이벤트로 넘기기
eventType = parser.next()
}
} catch(e: Exception) {
}
parser 에서 START_TAG 및 필요한 값들을 불러오면서 태그들을 검색하여 데이터를 구성한다.
이벤트 타입들은 아래와 같다.
- START_DOCUMENT: 해당 파서가 XML 문서의 맨 처음에 표시됩니다. 파싱의 시작
- START_TAG: XML 시작 태그(ex. <TAG>
- END_TAG: XML 끝 태그(종료 태그)(ex. </TAG>
- TEXT: XML에 포함된 문자 데이터(ex. <TAG>TEXT</TAG>
- END_DOCUMENT: XML 문서의 끝. 더이상의 이벤트가 없음을 알림
참고 링크
반응형
'안드로이드' 카테고리의 다른 글
Comments