코딩하는 개굴이

[안드로이드] XmlPullParser를 이용한 XML 처리 (feat. JAXB) 본문

안드로이드

[안드로이드] XmlPullParser를 이용한 XML 처리 (feat. JAXB)

개굴이모자 2023. 3. 27. 01:28
반응형

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) {

}

이벤트 타입들은 아래와 같다.

  • START_DOCUMENT: 해당 파서가 XML 문서의 맨 처음에 표시됩니다. 파싱의 시작
  • START_TAG: XML 시작 태그(ex. <TAG>
  • END_TAG: XML 끝 태그(종료 태그)(ex. </TAG>
  • TEXT: XML에 포함된 문자 데이터(ex. <TAG>TEXT</TAG>
  • END_DOCUMENT: XML 문서의 끝. 더이상의 이벤트가 없음을 알림

parser 에서 START_TAG 와 같은 타입들을 사용해 필요한 값들을 불러오면서 태그들을 검색하여 데이터를 구성하는 것이다.

참고 링크

반응형
Comments