[MFC] XML의 계층구조 데이터를 읽어 들이는 코드 (GetchildNodes, getAttribute, nextNode)
MFC&ActiveX 2008. 8. 20. 22:40 |MFC에서 xml 데이터를 읽어 들이는 예제입니다.
아래의 내용을 계층구조를 통해서 읽어 들이게 됩니다.
자세한 소스는 소스 코드를 참조 하세요.
- XmlParser.h, cpp
[xml 샘플]
<?xml version="1.0" encoding="EUC-KR"?>
<PATHS>
<PATH NAME="Install Files">
<PATH NAME="Dev">
</PATH>
<PATH NAME="Dev2">
</PATH>
<PATH NAME="Dev3">
<PATH NAME="Dev3_a">
</PATH>
<PATH NAME="Dev3_b">
<PATH NAME="Dev3_b_a">
</PATH>
<PATH NAME="Dev3_b_b"/>
</PATH>
</PATH>
</PATH>
<PATH NAME="temp">
<PATH NAME="temp_a"/>
<PATH NAME="temp_b">
<PATH NAME="temp_b_a">
</PATH>
<PATH NAME="temp_b_b">
<PATH NAME="temp_b_c"/>
</PATH>
</PATH>
</PATH>
</PATHS>
계층 구조를 읽어 들이는 코드 (재귀호출)
1. 초기화 및 도입부
///
MSXML2::IXMLDOMNodePtr nodeList = m_pDoc->selectSingleNode( Token.c_str() );
_bstr_t bsElements("PATHS");
if ( nodeList )
FindName( nodeList->GetchildNodes() );
nodeList.Release();
2. 재귀호출 부분
int tabCount = 0;
HRESULT CXmlParser::FindName( MSXML2::IXMLDOMNodeListPtr& lparam )
{
long elementCount = lparam->Getlength();
for( int i = 0; i < elementCount; i++ )
{
MSXML2::IXMLDOMElementPtr Element = lparam->nextNode();
if( Element == NULL )
break;
_bstr_t bsNodename = Element->GetnodeName();
_bstr_t bsElement("PATH");
if( bsNodename == bsElement )
{
_bstr_t bsname("NAME");
_variant_t varElementName = Element->getAttribute(bsname);
// 해당하는 엘러먼트 Name의 이름 == 폴더 이름을 의미한다.
CString strName;
strName.Format( "%S", varElementName.bstrVal );
// 탭 카운터를 통한 출력
CString strTabMergy;
for( int tc = 0; tc < tabCount; tc++ )
{
strTabMergy += "\t";
}
strTabMergy += strName;
TRACE( "%s\n", (LPSTR)(LPCSTR)strTabMergy);
MSXML2::IXMLDOMNodeListPtr childElementlist = Element->GetchildNodes();
if( childElementlist )
{
tabCount++;
FindName( childElementlist );
}
}
Element.Release();
}
tabCount--;
lparam.Release();
return S_OK;
}
아래의 콘솔 화면 내용입니다.
소스 코드 :
.