GSI

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 코드 :


Posted by gsi
: