[Visual C++] 서울시 열린데이터 광장 Open API 이용하기 – 4. XML 파싱 (tinyxml)

마지막으로 오늘은 서울시 열린데이터 광장에서 XML데이터를 받아 파싱하는 방법을 알아보겠습니다.
처음 보시는 분은 여기를 참고 바랍니다.

XML 파싱을 위한 클래스는 tinyxml을 사용하려 합니다.

아래 파일은 제가 MFC에 빌드가 되게 약간 수정한 파일이므로 아래 파일 다운 받으셔서 그림과 같이 프로젝트에 추가해주시기 바랍니다.

원본은 여기서 다운로드 하시면 됩니다.

그리고 아래 헤더파일을 include 합니다.

#include "tinyxml.h"

이번 글에서는 이 링크로 테스트 할 예정입니다. 해당 링크의 XML은 아래와 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
	<DailyAverageCityAir>
		<list_total_count>25</list_total_count>
		<RESULT>
			<CODE>INFO-000</CODE>
			<MESSAGE>정상 처리되었습니다</MESSAGE>
		</RESULT>
		<row>
			<MSRDT_DE>20130306</MSRDT_DE>
			<MSRRGN_NM>도심권</MSRRGN_NM>
			<MSRSTE_NM>중구</MSRSTE_NM>
			<PM10>74</PM10>
			<PM25>0</PM25>
			<O3>0.007</O3>
			<NO2>0.074</NO2>
			<CO>0.9</CO>
			<SO2>0.009</SO2>
		</row>
		<row>
		<MSRDT_DE>20130306</MSRDT_DE>
			<MSRRGN_NM>도심권</MSRRGN_NM>
			<MSRSTE_NM>종로구</MSRSTE_NM>
			<PM10>83</PM10>
			<PM25>0</PM25>
			<O3>0.011</O3>
			<NO2>0.075</NO2>
			<CO>1.1</CO>
			<SO2>0.013</SO2>
		</row>
		<row>
			<MSRDT_DE>20130306</MSRDT_DE>
			<MSRRGN_NM>도심권</MSRRGN_NM>
			<MSRSTE_NM>용산구</MSRSTE_NM>
			<PM10>78</PM10>
			<PM25>0</PM25>
			<O3>0.008</O3>
			<NO2>0.071</NO2>
			<CO>0.9</CO>
			<SO2>0.009</SO2>
		</row>
		<row>
			<MSRDT_DE>20130306</MSRDT_DE>
			<MSRRGN_NM>서북권</MSRRGN_NM>
			<MSRSTE_NM>은평구</MSRSTE_NM>
			<PM10>77</PM10>
			<PM25>0</PM25>
			<O3>0.014</O3>
			<NO2>0.053</NO2>
			<CO>0.7</CO>
			<SO2>0.009</SO2>
		</row>
		<row>
			<MSRDT_DE>20130306</MSRDT_DE>
			<MSRRGN_NM>서북권</MSRRGN_NM>
			<MSRSTE_NM>서대문구</MSRSTE_NM>
			<PM10>73</PM10>
			<PM25>0</PM25>
			<O3>0.019</O3>
			<NO2>0.058</NO2>
			<CO>0.6</CO>
			<SO2>0.008</SO2>
		</row>
	</DailyAverageCityAir>

DailyAverageCityAir의 list_total_count을 읽기 위해서는 아래와 같이 코딩합니다.

// XML Read
std::string strXml = acRead;
m_sResult = CA2W( strXml.c_str(), CP_UTF8 );

TiXmlDocument xmlRead;	// 선언
xmlRead.Parse( acRead ); // XML 파싱
			
// 1.
std::string strTest = xmlRead.FirstChildElement( "DailyAverageCityAir" )->FirstChildElement("list_total_count")->GetText();
CString sCount = CA2W( strTest.c_str(), CP_UTF8 );
AfxMessageBox( sCount );

row 같이 연속된 데이터에 대해서는 아래와 같이 순차적으로 읽어오면 됩니다.

// 2.
TiXmlElement* xmlRow = xmlRead.FirstChildElement( "DailyAverageCityAir" )->FirstChildElement("row");
CString sRow( _T( "" ) );
while (xmlRow)
{
	TiXmlElement* xmlData = xmlRow->FirstChildElement("MSRDT_DE");
	while(xmlData)
	{
		std::string strTest = xmlData->GetText();
		sRow += CA2W( strTest.c_str(), CP_UTF8 );
		sRow += _T(" ");
		xmlData = xmlData->NextSiblingElement();
	}

	sRow += _T("\n");
	xmlRow = xmlRow->NextSiblingElement();
}

AfxMessageBox(sRow);

결과

총 4개 글을 통해 서울시 열린데이터 광장에 인증키를 신청하고, 코딩을해서 json, xml 데이터를 읽어오는 방법에 대해 알아봤습니다.

사실 너무 오랜만에 해서 가물가물했어요, 그래서 설명이 정확하지 않았던 것 같습니다.
그래도 하나하나 따라하시면 구현에는 문제 없을 겁니다.