Post List

2015년 1월 4일 일요일

C++ XML Parser CMarkup

다운로드 사이트 :  http://www.firstobject.com

참고로 첨부파일은 11.5 버전입니다. (2013년 07월 15일 기준 최신버전)

XML 데이터를 쓰고 읽기 위해서 인터넷을 검색하던 중 STL 만을 사용하여 가볍게 구현된 CMarkup 이라는 Open Source 를 찾았습니다.

컴파일 할때 만약 Error 가 난다면 전처리기에 MARKUP_STL을 정의해 주시면 됩니다. 프로젝트의 속성 페이지에 설정하여 전역적으로 적용되도록 되어야 합니다.

먼저 XML File 작성 예제입니다.

void CView_Test1::OnBnClickedBtnXmlMake()
{
     CMarkup xml;

     xml.AddElem(_T("SETTING"));    // 현재 수준에서 원소를 추가합니다.
     xml.AddChildElem(_T("SIZE"));  // 현재 수준에서 원소를 차일드로 추가합니다.
     xml.IntoElem();                // 한단계 안으로 들어갑니다.
     xml.AddAttrib(_T("X"),_T("20")); // 현재 Element Attribute 추가합니다.
     xml.AddAttrib(_T("Y"),_T("20")); //IntoElem AddAttrib AddChildAttrib 똑같은 효과를 냅니다.
     xml.OutOfElem();                 // 현재 수준에서 나옵니다.

     xml.AddElem(_T("X"));
     xml.AddChildElem(_T("COL"));
     xml.IntoElem();
     xml.AddAttrib(_T("Count"),_T("3"));
     xml.AddChildElem(_T("Data"),_T("4")); // IntoElem AddElem 똑같은 효과를 냅니다.
     xml.AddChildElem(_T("Data"),_T("7"));
     xml.AddChildElem(_T("Data"),_T("2"));
     xml.OutOfElem();

     wstring csXML = xml.GetDoc();
     wcout << csXML <<endl;

     xml.Save(_T("TestXml.XML"));
}

만들어진 XML 파일입니다.

<SETTING>
<SIZE X="20" Y="20"/>
</SETTING>
<X>
<COL Count="3">
<Data>4</Data>
<Data>7</Data>
<Data>2</Data>
</COL>
</X>

다음은 XML Load 예제 입니다.
void CView_Test1::OnBnClickedBtnXmlLoad()
{
     CMarkup xml;
     wstring FileName(_T("TestXml.XML"));
     wcout << "Load XML File : " << FileName << " : ";

     if (xml.Load(FileName) == true)
     {
        cout << "Fail" << endl;
        return;
     }
     else
     {
         cout << "Success" << endl;
     }

     bool b1 = xml.FindElem(_T("SETTING"));  //Element 찾습니다.
     bool b2 = xml.IntoElem();
     bool b3 = xml.FindElem(_T("SIZE"));
     wstring SizeX = xml.GetAttrib(_T("X")); // 현재 Element에서 Attribute 값을 가져옵니다.
     wstring SizeY = xml.GetAttrib(_T("Y"));
     wcout << "Setting -> Size -> X : "<< SizeX << " , Y : " << SizeY << endl;
     bool b4 = xml.OutOfElem();

     bool b5 = xml.FindElem(_T("X"));
     bool b6 = xml.IntoElem();
     bool b7 = xml.FindElem(_T("COL"));
     int CountX = _wtoi(xml.GetAttrib(_T("Count")).c_str());
     wstring aaa = xml.GetAttrib(_T("Count"));
     wcout << "COL Count = " << CountX << endl;  
     bool b8 = xml.IntoElem();

     while(xml.FindElem(_T("Data")))
     {
         wcout << "Data : " << xml.GetData() << endl; // 현재 Element Data값을 가져옵니다.
     }
     bool b9 = xml.OutOfElem();
     bool b10 = xml.OutOfElem();
}

댓글 없음:

댓글 쓰기