[XML] XML 탐색하면서 데이터 읽기
C++ 2007. 12. 10. 19:30 |Dll 프로젝트를 하나 만들고 xml을 읽는 테스트를 진행해 봤다.
아래의 xml 파일을 읽는 테스트...
<?xml version="1.0" encoding="euc-kr" ?>
<Symbols>
<Scanorders>
<order Name="default">
<!--false이면 지그재그-->
<lineartype>true</lineartype>
<!--두개씩 쌍을 이룬다.
처음 두개는 진행방향 from > to 이고,
뒤에 두개는 흐름방향 이다.-->
<left>-1</left>
<right>-1</right>
<top>-1</top>
<bottom>-1</bottom>
</order>
</Scanorders>
<!--DefaultSymbol은 true이면 line이고, false이면 rectangle 이다.-->
<Symbol Name="none" Uid="0" Type="line" DefaultSymbol="true">
<HorizontalPixels>1</HorizontalPixels>
<VerticalPixels>11</VerticalPixels>
<SymbolWidth>12</SymbolWidth>
<SymbolHeight>13</SymbolHeight>
<ScanOrder>14</ScanOrder>
<TotalPixels>15</TotalPixels>
<TotalWidth>16</TotalWidth>
<TotalHeight>17</TotalHeight>
<Length>18</Length>
<Color>
<r>128</r>
<g>129</g>
<b>130</b>
</Color>
</Symbol>
<Symbol Name="none" Uid="0" Type="line" DefaultSymbol="true">
<!-- <HorizontalPixels>1</HorizontalPixels> -->
<VerticalPixels>2</VerticalPixels>
<SymbolWidth>2</SymbolWidth>
<SymbolHeight>2</SymbolHeight>
<ScanOrder>2</ScanOrder>
<TotalPixels>2</TotalPixels>
<TotalWidth>2</TotalWidth>
<TotalHeight>2</TotalHeight>
<Length>2</Length>
<Color>
<r>80</r>
<g>81</g>
<b>82</b>
</Color>
</Symbol>
<Symbol Name="none" Uid="0" Type="line" DefaultSymbol="true">
<HorizontalPixels>3</HorizontalPixels>
<VerticalPixels>3</VerticalPixels>
<SymbolWidth>3</SymbolWidth>
<SymbolHeight>3</SymbolHeight>
<ScanOrder>3</ScanOrder>
<TotalPixels>3</TotalPixels>
<TotalWidth>3</TotalWidth>
<TotalHeight>3</TotalHeight>
<Length>3</Length>
<Color>
<r>150</r>
<g>151</g>
<b>152</b>
</Color>
</Symbol>
</Symbols>
C++ 에서 테스트할때..
TRACE("--- xml start ---\n");
if(m_TestXmlWrap2.Load("d:\\symbol.xml")) {
// 정상적으로 읽었다면 여기로..
HRESULT hr;
MSXML2::IXMLDOMDocument2Ptr pDoc;
MSXML2::IXMLDOMNodeListPtr pNodeList;
MSXML2::IXMLDOMNodePtr pNodeSub;
MSXML2::IXMLDOMNodeListPtr pNodeSubList;
MSXML2::IXMLDOMNodePtr pNodeSubSub;
MSXML2::IXMLDOMNodePtr pNodeSubSubSub;
MSXML2::IXMLDOMElementPtr pNodeSubElement;
BSTR bszNodeValue;
TRACE("--- xml start ---\n");
if(m_TestXmlWrap2.GetDoc()) {
pNodeList = m_TestXmlWrap2.GetDoc()->selectNodes(".//Symbol");
for(int i = 0; i < pNodeList->length; i++) {
pNodeSub = pNodeList->Getitem(i);
// 같은 노드가 하나 이상은 존재 하지 않는다고 가정한다.
pNodeSubSub = pNodeSub->selectSingleNode(".//HorizontalPixels");
string value = "none";
if(pNodeSubSub)
value = (LPCTSTR)pNodeSubSub->Gettext();
TRACE1("Symbol/HorizontalPixels=%s\n", value.c_str());
}
}
TRACE("--- xml end ---\n");
TRACE("--- xml start ---\n");
if(m_TestXmlWrap2.GetDoc()) {
pNodeList = m_TestXmlWrap2.GetDoc()->selectNodes(".//Symbol");
for(int i = 0; i < pNodeList->length; i++) {
pNodeSub = pNodeList->Getitem(i);
pNodeSubList = pNodeSub->selectNodes(".//Color");
for(int i = 0; i < pNodeSubList->length; i++) {
pNodeSubSub = pNodeSubList->Getitem(i);
string value;
// 같은 노드가 하나 이상은 존재 하지 않는다고 가정한다.
pNodeSubSubSub = pNodeSubSub->selectSingleNode(".//r");
value = "none";
if(pNodeSubSubSub)
value = (LPCTSTR)pNodeSubSubSub->Gettext();
TRACE1("Symbol/Color/r=%s\n", value.c_str());
// 같은 노드가 하나 이상은 존재 하지 않는다고 가정한다.
pNodeSubSubSub = pNodeSubSub->selectSingleNode(".//g");
value = "none";
if(pNodeSubSubSub)
value = (LPCTSTR)pNodeSubSubSub->Gettext();
TRACE1("Symbol/Color/g=%s\n", value.c_str());
// 같은 노드가 하나 이상은 존재 하지 않는다고 가정한다.
pNodeSubSubSub = pNodeSubSub->selectSingleNode(".//b");
value = "none";
if(pNodeSubSubSub)
value = (LPCTSTR)pNodeSubSubSub->Gettext();
TRACE1("Symbol/Color/b=%s\n", value.c_str());
}
}
}
TRACE("--- xml end ---\n");
// 저장
m_TestXmlWrap2.Save(_T("d:\\save_test.xml"));
}
Dll 코드 :