GSI

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;
}

아래의 콘솔 화면 내용입니다.

사용자 삽입 이미지


소스 코드 :


.

Posted by 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
:

XML 처리방법

C++ 2007. 12. 6. 12:53 |

XML 데이터 처리 하는 방법 정리.
파일 읽기, http 정보 읽기, 노드 정보 출력, 노드 검색 정보 출력


1. XML 파일 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}
AfxMessageBox(pDoc->xml);

2. http을 통한 XML 파일 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

DWORD startTick = GetTickCount();
pDoc->put_async(VARIANT_FALSE);
HRESULT hr = pDoc->load((_variant_t)"http://localhost/TestXml/test2.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}
AfxMessageBox(pDoc->xml);

3. XML 데이터의 첫번째 해당 노드값 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}

MSXML2::IXMLDOMNodePtr pNode;
pNode = pDoc->selectSingleNode(L"//name");

CString outString;
outString.Format("[검색결과] 노드명:%s, 노드값:%s\r\n", (LPCTSTR)pNode->GetnodeName(), (LPCTSTR)pNode->Gettext());
AfxMessageBox(outString);

4. XML 데이터의 해당 노드값 모두 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}

MSXML2::IXMLDOMNodeListPtr pNodeList;
pNodeList = pDoc->selectNodes(L"//name");

CString outTotalString;
for(int i = 0; i < pNodeList->length; i++) {
 CString outString;
 outString.Format("[검색결과] 노드명:%s, 노드값:%s\r\n",
  (LPCTSTR)pNodeList->Getitem(i)->GetnodeName(),
  (LPCTSTR)pNodeList->Getitem(i)->Gettext());
 outTotalString.Append(outString);
}
AfxMessageBox(outTotalString);

나머지 노드값 변경하는 방법,
속성값 읽어 오기 및 변경 방법 등을 정리 해야 함.

테스트 소스 :

Posted by gsi
:

본 내용은 클라이언트 xsl 적용 방법 입니다.

[categories.xml]

<?xml version='1.0' ?>
<?xml-stylesheet type='text/xsl' href='categories.xsl'?>
<categorylist xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
 <sql:query>
  SELECT categoryid, categoryname
  FROM categories
  FOR XML AUTO, ELEMENTS
 </sql:query>
</categorylist>

[categories.xsl]
<?xml version='1.0' ?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  <xsl:template match='/'>
    <BODY>
      <TABLE>
        <TR>
          <TD><B>Click a Product Category</B></TD>
        </TR>
        <xsl:for-each select='categorylist/categories'>
          <TR>
            <TD>
              <A>
                <xsl:attribute name='HREF'>
                  Products.xml?categoryid=<xsl:value-of select='categoryid'/>
                  &amp;contenttype=text/html
                </xsl:attribute>
                <xsl:value-of select='categoryname'/>
              </A>
            </TD>
          </TR>
        </xsl:for-each>
      </TABLE>
    </BODY>
  </xsl:template>
</xsl:stylesheet>
Posted by gsi
:

XML 템플릿 사용

XML에서 템플릿(template)은 데이터를 처리하기 위해 질의문을 미리 생성해 놓은 문서를 말한다. 사용자가 직접 서버에 URL 질의를 입력해서 데이터를 검색하는 것보다 XML 템플릿을 이요하면 좀더 안정적이고, 제어 가능한 환경을 만들 수 있다. 템플릿은 데이터베이스에서 데이터를 검색하기 위한 질의를 하나 이상 포함하고 있고, 그 결과는 호출한 브라우저나 클라이언트 애플리케이션에서 보낸다. 템플릿은 XML-SQL 네임스페이스를 기반으로 하는 XML문서다.

HTTP와 템플릿을 사용하기 위해서 가상 이름에 템플릿 파일을 저장하고 템플릿에 접근하기 위해 URL을 통해 템플릿 파일에 접근할 수 있다. 예를 들면 products.xml이란 파일명으로 저장한 템플릿 파일이 있다면 다음과 같은 URL을 통해 접근할 수 있다.

템플릿을 사용하려면 가상 이름에 템플릿 질의 허용을 체크해 놓아야 한다. IIS에 SQL XML 구성 지원 MMC 스냅인 툴에서 설정 탭의 템플릿 질의 허용을 체크하는 것으로 해당하는 가상 디렉토리에 템플릿 질의를 허용할 수 있다.

템플릿 생성과 사용
기본적으로 XML 템플릿의 구성은 XML 문서와 동일한 구조다. 다만 SQL문을 포함하고 있다는 점이 다르다. SQL 문을 사용하기 위해서 최상위 요소에 'sql' 네임스페이스를 지정하고 <query> 요소를 사용한다. 다음은 노스윈드(northwind) 데이터베이스로부터 제품목록을 보여 주는 템플릿을 생성한 예다.

<?xml version='1.0'?>
<categorylist xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
      <sql:query>
            SELECT categoryid, categoryname
            FROM categories
            FOR XML AUTO, ELEMENTS
      </sql:query>
</categorylist>

템플릿 가상 이름(templates)을 지정한 곳(c:\sqlroots\northwinddata\)에 이 제폼 목록 템플릿을 categories.xml로 저장한다. 이 코드에서 템플릿은 ADO를 통한 질의 템플릿을 사용하는 것과 같은 형식을 가진다. 템플릿에 접근할 때 <query> 태그는 XML 데이터를 처리하며, 수행한 질의 결과는 호출한 곳으로 반환한다. 다음은 XML 템플릿을 IIS 웹 서버를 통해 실행하게 된다.

이 코드를 인터넷 웹 브라우저에서 실행해 보길 바란다.
원하는 결과가 나왔다면 다행이지만..
HTTP:500 내부 서버 오류 라는 말이 나오게 되면 xml 파일의 이상이다.

템플릿 확장
템플릿을 확장하는 방법으로 파라미터 추가가 있다. 파라미터는 사용자가 하나 이상의 다앙햔 결과를 볼 수 있게 한다. 예를 들면, 템플릿을 파라미터를 받을 수 있게 생성하고, 사용자가 CategoryID 파라미터를 넘겨 주면 제품 목록 중 특정 제품의 상세 정보를 나타나게 작성할 수 있다. 파라미터는 템플릿 헤더에 위치하고, <header> 태그를 사용해서 정의한다. 각 파라미터는 <param> 태그를 사용해 정의할 수 있다. 다름은 파라미터를 사용해서 카테고리 번호를 넘겨주고, 해당 카테고리의 제품 목록을 출력하는 XML 템플릿이다.

<?xml version='1.0'?>
<productlist xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
      <sql:header>
            <sql:param name='categoryid'>1</sql:param>
      </sql:header>
      <sql:query>
            SELECT productid, productname, unitprice
            FROM products WHERE categoryid = @categoryid
            FOR XML AUTO, ELEMENTS
      </sql:query>
</productlist>

products.xml 템플릿 문서에서는 categoryid 기본값으로 1을 지정한다 .파라미터를 인식하려면 <param> 태그를 name 속성으로 사용해야 한다. 이 이름을 @ 기호와 함께 사용해서 SQL 질의에서 사용할 수 있다. 파라미터화한 템플릿으로 데이터에 접근하기 위해 URL 질의 스트링에 파라미터를 지정한다. 다음은 카테고리 번호 2를 파라미터로 전달하고, 템플릿을 실행하는 코드이다.

categoryid를 2로 입력된 하면을 볼 수 있다.

Posted by gsi
:

저번장까지 IIS를 설치하고 가상 디렉토리까지 마무리 했습니다.
이제 HTTP 를 사용해서 어떻게 사용하는 지에 대해서 간단하게 짚고 넘어 가겠습니다.

URL 질의 사용
가상 디렉토리가 제대로 설정되어 있는지 확인하는 간단한 방법은 URL 질의를 가능하게 한 후, XML 가능 브라우저를 사용해서 질의문을 실행해 보는 것입니다. URL에서 데이터를 추출할 경우 질의와 다른 설정이 적절한지 확인하기 위해 파라미터를 이용할 수 있다. 이 파라미터는 URL 질의 문자열에 표준 형식을 사용해서 보낼 수 있다. URL과 파라미터를 분리하려면 ? 기호를 사용하고, 여러개의 파라미터를 보낼 때는 각 파라미터를 & 기호를 이용해서 분리한다. 다음 URL 포맷은 2개의 파라미터를 이요해서 URL로 데이터에 접근할 때 사용한 예입니다.

URL 질의를 이용해서 FOR XML 질의를 포함하는 SQL 파라미터를 지정할 수 XML 문서를 추출할 수 있다. FOR XML 질의의 결과가 잘 구성한 XML 문서를 반환하기 보다 XML 데이터를 반환하기 때문에 최상위 요소를 URL에 반드시 지정해야 한다. 그래서 최상위 요소를 정확히 지정하거나 최상위 요소 파라미터를 지정해 처리할 수 있다.

다음 예제는 Northwind 데이터베이스의 Products 테이블로부터 데이터를 검색하는 것으로 사용하는 URL 질의다. 최상위 요소는 SQL 파라미터의 일부로 포함한다. 최상위 요소는 <catalog>로 임의의 요소를 정의하였다.

http://localhost/northwinddata?sql=SELECT+'<catalog>';SELECT+*+
FROM+products+FOR+XML+AUTO;SELECT+'</catalog>
또는
http://localhost/northwinddata?sql=SELECT+*+FROM+products+FOR+XML+AUTO&
root
=catalog

위의 내용을 인터넷 브라우저에서 확인 가능하다. 한번씩 해보길 바란다.

URL 질의를 하나하나 SQL문으로 작성하는 것은 상당히 번거로운 작업이다. 이러한 번거로움은 T-SQL의 EXECUTE 구문이나 ODBC를 호출해 저장 프로시저를 수행하면 해결할 수 있다. 효율적으로 URL 질의를 사용할 수 있을 뿐만 아니라 보안 측면에서도 훨씬 유리하다. 실제로 UTL질의 문을 한번 살펴 보자.

사용자 삽입 이미지
URL 질의에서 저장 프로시저를 호출할 수 있게, EXECUTE 구문과 저장 프로시저 이름, 파라미터를 브라우저 주소란에 입력한다.

결과는 직접 확인 바랍니다.



 

Posted by gsi
:

테스트 환경 : SQL 2000 입니다.

IIS 가상 디렉토리를 통한 데이터베이스 처리
SQL 서버 2000의 HTTP 처리를 위한 툴은 MMC에 스냅인 된 IIS에 SQL XML 구성 툴을 사용한다. SQL XML 지원 구성을 실행하려면 [시작]>[프로그램]>[Microsoft Sql server]>[IIS에 SQL XML 지원 구성]을 차례로 선택하여 실행한다.

사용자 삽입 이미지

IIS에 SQL XML 지원 구성을 실행하면 관리창을 볼 수 있다. 관리창을 이용하면 IIS의 가상 디렉토리로 이루어진 SQL 서버 2000의 XML 처리를 생성하고 관리할 수 있다. 관리 창을 수행한 후, 서버를 확장하면 로컬 컴퓨터에 구성한 웹 사이트는 왼쪽창에 나타난다. 왼쪽 창의 IIS 가상 디렉토리 관리를 선택해 서버를 관리할 수 있고, 원격 시스템 동작 메뉴를 이용해 등록할 수도 있다.

새로운 가상 디렉토리를 설정하려면 먼저 처리할 웹 사이트를 선택해야 한다. 기본 웹 사이트나 [동작] 메뉴를 선택한 후, [새로 만들기]>[가상 디렉토리]를 선택한다. 새로운 가상 디렉토리를 구성하는 대화 상자가 열린다.
사용자 삽입 이미지

가상 디렉토리 이름과 경로 지정
가상 디렉토리는 URL을 처리 하는 부분이다. 이름은 인트라넷 환경 형식인 'http://서버경로/가상디렉토리' 형태로 만든다. 가상 디렉토리 부분에는 IIS 서버 URL 중 도메인 부분을 지정한다.

자신의 시스템을 로컬에서 사용할 경우 http://localhost/northwinddata 형태로 사용할 수 있다. [로컬 경로]에서는 가상 디렉토리 지정된 물리적인 위치의 전체 경로를 지정할 수 있다.
사용자 삽입 이미지

가상 디렉토리 보안 설정
SQL 서버 2000의 인증 방법은 크게 두 가지로 나눌 수 있다. 첫번째는 윈도우 서버의 운영체제와 SQL 서버간의 통합한 인증 절차다. 운영체제 차원에서 인증 과정을 통과하면 자동적으로 SQL 서버의 인증도 통과하는 방식이다. 두번째는 운영체제와 SQL 서버의 분리한 인증방법으로, SQL 서버에서 인증 과정을 별도로 관리하는 것을 말한다. 어떤 인증 방법을 사용해도 상관없이, 설정한 인증 방법에 따라[보안] 설정을 하면 된다.
사용자 삽입 이미지

데이터 원본 지정
새 가상 디렉토리의 등록 정보 대화 상자의 [데이터 원본] 탭에서 SQLISAPI 애플리케이션에 데이터를 제공할 [SQL Server]와 [데이터베이스]를 지정한다. 데이터를 저장할 서버를 지정해야 하고, 데이터가 있는 데이터베이스 이름도 지정한다.
사용자 삽입 이미지

데이터 접근 지정
가상 디렉토리를 통한 데이터접근할 수 있게 설정하기 위해서 새 가상 디렉토리 등록 정보의 [설정]탭을 이용한다.

설정은 네 가지 중 선택할 수 있다. 모든 질의 방식을 지원받으려면 네 가지를 모두 체크하면 된다.

  • URL 질의 허용
  • 템플릿 질의 허용
  • XPath 허용
  • POST 허용

사용자 삽입 이미지

가상 이름(Virtual Name) 생성
가상 디렉토리 등록 정보 대화 상자의 [가상 이름] 탭에서 디렉토리를 위한 가상 이름을 설정할 수 있다. 가상 이름은 템플릿 스키마 또는 데이터베이스 객체를 지정하기 위해 URL에서 사용한다. 가상 이름은 템플릿, 스키마, 데이터베이스 객체형으로 가상 이름의 [새로 만들기]를 선택해 원하는 가상이름, 유형, 경로를 생성할 수 있다.
사용자 삽입 이미지
지정한 폴더에 XML 템플릿과 스키마를 포함하게 가상 이름을 사용할 수 있다. 예를 들면 Northwind data 가상 디렉토리 애플리케이션에서 products.xml 이라고 정의한 템플릿을 포함하는 폴더에 가상 이름 templates를 지정할 수 있다. 이 템플릿은 http://localhost/northwinddata/templates/products.xml과 같은 URL을 통해 접근할 수 있다.

여기까지 해서 설정이 모두 완료가 되었습니다. IIS(인터넷 정보 서비스)를 열어 보면 가상 디렉토리가 설정되어져 있는 것을 볼 수 있습니다.

이상..

Posted by gsi
:

SQL 서버 2000에서 제공하는 새로운 기능 중 HTTP를 이용해서 XML 데이터에 접근하는 방법을 알아본다. HTTP를 이용해서 인트라넷이나 인터넷 기반 애플리케이션을 구축할 수 있다. 이 방법은 Micorsoft IIS의 가상 디렉토리를 구축하는 방법으로 XML 데이터를 처리하거나 다른 애플리케이션에 쉽게 적용할 수 있다. HTTP로 데이터를 처리하는 기능으로 ASP 애플리케이션보다 적은 코드를 이용하면서도 쉽고 빠르게 데이터 중심적인 웹 사이트를 구축할 수 있다.

XSL 스타일시트를 XML 데이터에 적용해서 HTML 문서로 변형한 후, 브라우저 기반 클라이언트로 전송하거나 WML과 같은 다른 문서 형태로 변환해서 WAP 형식으로 휴대폰, PDA 등에 사용이 가능해 진다.

SQL 서버의 HTTP 처리 구조
SQL 서버는 SQLISAPI(SQL 서버에서 제공하는 ISAPI 애플리케이션)FMF DLDYDGOTJ ㅗㅅ세FMF CJFLGKSEK. IIS에 가상 디렉토리 루트를 생성한 후, HTTP URL을 이용하면 SQL 서버의 데이터베이스에 접근할 수 있다. SQLISAPI 애플리케이션은 SQL 서버 2000의 OLE-DB 공급자를 이용해서 클라이언트로 XML이나 HTML 데이터를 보낸다.

SQL 서버를 IIS 웹 서버와 동일한 시스템에 구축할 수 있다. SQL 서버에는 데이터를 테이블에 저장할 수 있고, 클라이언트로부터 IIS 웹 서버에 의해 질의문을 전송받고, 전송받은 질의문을 실행해서 질의한 결과의 데이터를 XML 문서의 형태로 IIS 웹 서버를 통해 클라이언트에게 전송한다. 클라이언트 애플리케이션은 다음과 같이 네 가지의 방법 중 하나로 데이터를 요청할 수 있다.

  • FOR XML 질의문을 질의 스트링으로 URL에 보내는 방법
  • XML 질의 템플릿을 ISAPI 애플리케이션에 포스팅 하는 방법
  • XML 질의 템플릿을 웹 서버의 가상 루트에 지정하는 방법
  • XML 스키마를 웹 서버의 가상 루트에 정의하는 방법





 

Posted by gsi
: