[C#] XmlDocument 클래스 사용해서 XML 파싱하는 방법

C# & MFC

[C#] XmlDocument 클래스 사용해서 XML 파싱하는 방법

 

 환경: Visual Studio C# 2012

 

XmlDocument 클래스를 사용해서 XML 로 전송되어 오는 데이터를 분해하는 방법에 대해 알아 보겠습니다. 아래 예제는 네이버 맵 API 를 호출하고 받은 데이터를 파싱한 것입니다.

 

간단하게 폼을 만들었습니다. 검색 버튼을 눌렀을 때 해당 입력값인 주소를 네이버맵 API 호출해서 Geocode 값을 가져오는 샘플입니다. 그 과정에서 XML 데이터를 받게 되는 게 XmlDocument 클래스를 이용해서 위도와 경도를 분리할 것입니다.

 

검색 버튼을 클릭했을 때 네이버 API 로 넘어온 XML 데이터 입니다. XmlDocument 클래스를 이용해서 <Address> 값과 <point><x><y> 값을 가져올 것입니다. x , y 값이 경도와 위도 값입니다.

 

<?xml version="1.0" encoding="utf-8" ?>
<geocode xmlns="naver:openapi">
	<userquery><![CDATA[부산시]]></userquery>
	<total>1</total>
	<item>
		<point>
			<x>129.0750220</x>
			<y>35.1798160</y>
		</point>
		<address>부산광역시</address>
		<addrdetail>
			<sido><![CDATA[부산광역시]]>
				<sigugun><![CDATA[]]>
					<dongmyun><![CDATA[]]>
					</dongmyun>
				</sigugun>
			</sido>
		</addrdetail>
	</item>
</geocode>

 

파싱을 위해서 XmlDocument 객체를 생성합니다. 그리고 LoadXml 함수에 호출하고 받은 XML 문자열을 집어 넣습니다. 그럼 호출과 동시에 파싱이 되겠죠. 파싱된 데이터에서 접근을 위해 GetElementsByTagName 함수를 이용합니다. 파라미터로 입력한 태그값에 해당하는 영역을 XmlNodeList 로 반환하게 됩니다. <item> 여러 개 일수 있으므로 foreach 를 돌립니다. 그리고 각 요소에 접근은 다차원 배열처럼 접근하시면 됩니다.


XmlDocument xml = new XmlDocument(); // XmlDocument 생성
xml.LoadXml(strXml);
XmlNodeList xnList = xml.GetElementsByTagName("item"); //접근할 노드

foreach (XmlNode xn in xnList)
{
    string address = xn["address"].InnerText;
    string lat = xn["point"]["x"].InnerText;
    string lng = xn["point"]["y"].InnerText;
}

 

아래 소스는 XML 에서 주소와 위도, 경도값을 추출하고 나서 ListView 에 값을 추가하는 내용 입니다. BeginUpdate() EndUpdate() 함수를 사용해서 값을 추가 후 데이터가 보이도록 화면을 업데이트 합니다.

using System.Xml;

private void SetNaverXmlParseing(String strXml)
{
    var adds = new List<List<string>>();

    XmlDocument xml = new XmlDocument(); // XmlDocument 생성
    xml.LoadXml(strXml);
    XmlNodeList xnList = xml.GetElementsByTagName("item"); //접근할 노드
            
    foreach (XmlNode xn in xnList)
    {
        List<string> add = new List<string>();
        add.Add(xn["address"].InnerText);
        add.Add(xn["point"]["x"].InnerText);
        add.Add(xn["point"]["y"].InnerText);

        adds.Add(add);
    }
          
    lstAddress.BeginUpdate();
    foreach (var row in adds)
    {
        var item = new ListViewItem(lstAddress.Items.Count.ToString());
        item.SubItems.AddRange(row.ToArray());
        lstAddress.Items.Add(item);
    }
    lstAddress.EndUpdate();
}
저작자 표시 비영리 변경 금지
신고
Posted by 녹두장군