728x90
mshtml.HTMLDocument doc = (mshtml.HTMLDocument) webBrowser1.Document;
이런식으로 웹브라우저 컨트롤의 도큐먼트를 얻게 되면,
"오류 1 'System.Windows.Forms.HtmlDocument' 형식을 'mshtml.HTMLDocument' 형식으로 변환할 수 없습니다." 오류를 발생시키게 된다.
문제를 해결하기 위해 구글에서 검색하여 보았는데,

mshtml.HTMLDocument oDoc = new HTMLDocumentClass();
oDoc = (mshtml.HTMLDocument)webBrowser1.Document;

이런식으로 고치면 에러를 해결할수 있다고 하였으나, 역시나 같은 에러 메시지를 출력 하였다.
 mshtml.HTMLDocument HTMLDoc = new HTMLDocument();
 HTMLDoc = (mshtml.HTMLDocument)webBrowser1.Document.DomDocument;
로 구문을 고치니까,웹브라우저 컨트롤의 도큐먼트를 얻을 수있었다

원문 : http://sixthman23.tistory.com/category/DotNet
728x90
6. XSL & XML

  안녕하세요.지난 강좌까지 XML 문서와 DTD 문서에 대해서 간단히 알아 보았습니다.

오늘은 기초 강좌의 마지막으로 XSL에 대해서 또 간략하게 알아보도록 하겠습니다.



사용될 예제는 지난번에 사용된 cds.xml을 확장해서 사용합니다. 역시 소스는 자료모음 에서 받으면 됩니다.



지난번에 설명했듯이 XML은 문서의 구조를 표현하는 것과 문서를 보여주는 것(포매팅)이 서로 분리 되어 있다고 했습니다.

이렇게 XML 문서를 보여주기 위해서 사용되는 것이 XSL과 CSS가 있습니다.

CSS는 HTML에서도 사용되었던 것입니다. 이걸 XML에 적용한 것이구요.

XSL은 SGML에 있었던 DSSSL을 확장한 것이라 생각하면 됩니다.



간단한 XML 문서의 경우 CSS를 사용할 수 있지만 제대로 된 포매팅을 공부해 보시려면 XSL을 잘 봐야 합니다.

해서 저는 오늘 XSL에 대해서 제가 아는 만큼 아주 간단히 다루려고 합니다.



지난 강좌에 사용한 cds.xml에 XSL과 같은 스타일 쉬트를 사용하지 않으면 다음과 같이 나타납니다.





<그림 1 : XSL을 사용하지 않은 cds.xml 문서>



여기에 오늘 사용할 간단한 XSL을 붙이면 다음과 같은 형태로 웹 브라우저에 나타납니다.





<그림 2 : XSL을 사용한 cds.xml 문서>



음.. 예전에는 소스를 모두 제공했는데요.. 현재는 서버 용량상 그것은 힘들 것 같네요.. 그렇지만 만약 요청을 하시면, 소스 자료실 정도를 함 만들어 볼까 함니다.



그럼 XSL을 통해서 어떻게 XML 문서가 보여지는 지 다음 그림을 보시죠.





<그림 3 : XSL Two Process (출처 : http://www.w3.org/TR/xsl/)



위의 그림에서 보면 XSL은 크게 2가지로 나누어서 처리하고 있습니다. 첫 번째 것은 XSL Transform이고 두 번째는 XSL Formatter입니다.



XSL Transform은 XML 문서를 다른 포맷의 문서나 다른 XML 문서로 변경하는 것입니다.

그리고 XSL Formatter는 변경된 XML문서를 웹 브라우저나 다른 매체에서 볼 수 있는 형태로 만들어 주는 것입니다.



XSL Transform은 1999년 11월 16일에 W3C에서 Recommendation되었구요. 현재 1.1버전이 Working Draft상태에 있습니다.

그리고 XSL Formatter는 현재 Candidate Recommendation 상태에 있습니다.



참고로 W3C에 문서가 제출되면 다음과 같은 단계를 거쳐서 표준으로 인정됩니다.

Notes -> Working Draft -> Candidate Recommendation -> Proposed Recommendation -> Recommendation



표준으로 인정되기까지 상당한 어려움이 있겠죠.

어쨌든 우리가 오늘 공부하게 될 것은 XSL Formatter가 됩니다. 웹 브라우저에 보여지는 것을 공부할 테니까요^^;;



자 그럼 시작해 볼까요?? 전체 소스는 위의 소스받기를 하면 받을 수 있습니다.

여기서는 각 부분별 XSL 소스를 가지고 설명 드리도록 하겠습니다.



XSL 문서도 XML 문서의 일종이므로 다음과 같이 XML 선언과 루트 엘리먼트로 시작합니다.
<?xml version='1.0' encoding="ksc5601"?>
<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/TR/WD-xsl"
        xmlns="http://www.w3.org/TR/REC-html40"
        result-ns="">





여기서 하나만 설명하고 지나가도록 하겠습니다. xmlns:xsl~~~ 이런 형태로 표현되고 있는 것이 있습니다.

우리는 이러한 것을 XML의 NameSpace라고 합니다. 우리말로는 이름공간이라고도 하더군요.

XML은 태그를 만들어서 사용할 수 있기 때문에 우연히 같은 태그가 웹상에서 공존할 수 있습니다.

그럴 경우 서로 구분지어줄 것이 필요합니다. 그러한 역할을 수행하는 것이 바로 NameSpace입니다.



만약 A와 B란 사람 모두 <test>란 태그를 사용한다면  <A:test> <B:test>와 같이 사용함으로서 구분이 가능하다는 것입니다.

설명이 되었나요?? 실은 저두 대략적으로 밖에 모르는 부분이라서~~ 쩝!!!

  1: <xsl:template match="/">
2:     <HTML>
3:       <HEAD>
4:         <TITLE>음반 CD를 이용한 XSL 처리</TITLE>
5:       </HEAD>
6:       <BODY>
7:         <P>음반 CD 모음집</P>
8:         <xsl:apply-templates/>
9:       </BODY>
10:    </HTML>
11: </xsl:template>





1번줄에 <xsl:template match="/">라고 사용된 부분이 있습니다. xsl:template는 XML의 요소가 다음 템플릿처럼 변환되면 된다고 설명하는 것입니다.

여기서는 "/"로 되어 있으니까 루트 엘리먼트를 만나면 xsl:template를 처리하라는 의미가 되겠죠.

그럼 xsl:template가 하는 일은 <xsl:template>에서 </xsl:template>까지 XML 문서에 적용하라는 것입니다.



그렇게 되면 2~10번 사이의 내용을 기반으로 XML 문서를 변환하게 됩니다. 2~10번 줄은 잘 보시면 기존의 HTML 형태입니다.

HTML 태그를 이해하는 것은 별 어려움이 없을 것 같네요. 여기서는 설명의 편의를 위해서 HTML 태그는 대문자로 처리하였습니다.



엉~~ 그런데 못보던 것이 보이네요.. 8번째 줄에요..

<xsl:apply-templates/>

이것이 무엇일까요?? 템플릿을 적용하라는 거죠.

즉, 현재 엘리먼트의 자식노드들 중에서 <xsl:template match="">과 일치하는 엘리먼트를 만나면 해당 내용으로 변환하라는 의미가 됩니다.



소스의 다음 부분을 보도록 하죠.

<xsl:template match="compactdiscs">
        <xsl:apply-templates select="compactdisc"/>
</xsl:template>





이것도 마찬가지죠.. <compacdiscs>란 엘리먼트를 만나면 이 부분으로 변환하는데..

또 템플릿을 적용하라고 나와있죠.. 하지만 위의 apply-templates와의 차이점은 여기서는 엘리먼트를 지정하고 있다는 것입니다.

즉, <compactdisc>를 만나면 해당 템플릿을 사용하라는 거죠.



<compactdisc>의 템플릿은 다음과 같습니다.

1: <xsl:template match="compactdisc">
2:         <FONT SIZE="2">
3:         음악가 : <xsl:value-of select="artist"/>
4:         </FONT><BR/>

5:         <FONT SIZE="2">
6:         CD 제목 : <xsl:value-of select="title"/>
7:         노래 수 : <xsl:value-of select="title/@numberoftracks"/>
8:         </FONT><BR/>

9:        <FONT SIZE="2">
10:        노래 곡명 <BR/>
11:        <TABLE BORDER="0">
12:        <xsl:for-each select="tracks/track">
13:                <TR>
14:                        <TD WIDTH="50"> </TD>
15:                        <TD><xsl:value-of/></TD>
16:                </TR>
17:        </xsl:for-each>
18:        </TABLE>
19:       </FONT>

20:        <FONT SIZE="2">
21:        가격 : <xsl:value-of select="price"/>
22:        </FONT><P/><BR/>
23: </xsl:template>





여기서 많은 XSL의 기본 사항을 볼 수 있네요 ^^:; 하나씩 살펴보도록 하죠.

1번째 줄의 <xsl:template match="compactdisc">는 앞에서도 설명한 것이죠.

<compactdisc>를 만나면 위의 <xsl:tempalte>와 </xsl:template>사이의 내용으로 변화하라는 의미가 되는 거지요.



<xsl:tempalte>와 </xsl:template>사이를 보면 굉장히 길지만 대부분이 눈에 익숙한 HTML 태그입니다.

그렇죠..

자.~~ HTML 태그를 제외하고 나머지 XSL이 사용된 부분을 가지고 설명을 하지요.

참! 당연한 얘기지만 <BR>태그가 사용된 걸 보세요.. XSL도 XML 문서이므로 당연히 시작태그와 닫는태그가 존재해야겠지요.

그래서 <BR/>과 같은 빈 엘리먼트의 형태로 사용되었습니다. 참고하시라구요^^;;



가장 많이 사용되는 것으로 다음과 같은 것이 있습니다.

<xsl:value-of select="artist"/>



<xsl:value-of>는 뒤의 select와 일치하는 태그가 있으면 그 태그의 내용을 가져와서 현재 위치에 포함하라는 의미로 해석하면 됩니다.

즉,, 실제 소스에서

<artist> Frank Sinatra </artist>

와 같은 형태로 표현되어 있을 경우

<xsl:value-of select="artist"/> 부분에 <artist>의 내용 Frank Sinatra가 들어가게 됩니다.



좀 이해가 되나요??

6번줄이나 21번 줄도 같은 의미로 해석할 수 있겠죠..

CD 제목 : <xsl:value-of select="title"/>

가격 : <xsl:value-of select="price"/>



실제 XML문서에서 <title> 태그와 <price>태그의 내용이 포함되면 되겠죠.



12번줄에서 17번 줄은 XSL에서 테이블과 같은 것을 사용하고 할 경우에 표현할 수 있는 방법을 나타낸 것입니다.

여기에서 사용된 <xsl:for-each>는 반복을 나타내는 XSL 요소입니다. 일반 프로그램 언어의 for문과 비슷하죠.



다만 XML은 같은 요소가 반복될 수 있습니다. 그래서 <xsl:for-each select="tracks/track">



tracks/track이 반복될 때마다 <xsl:for-each>사이의 문장을 수행하라는 의미가 되죠.



그렇다면 tracks/track은 무얼 나타낼까요? 이것은 부모 자식 관계를 나타냅니다.

XML 문서는 포함관계로 이루어져 있으므로 <tracks> 엘리먼트의 자식으로 <track>이 나타날 때마다 적용시켜라라는 의미로 해석하면 됩니다.



<xsl:value-of/>이렇게 사용된 부분은 이미 무슨 엘리먼트인지 알고 있기 때문에 굳이 지정하지 않아도 <track>의 내용을 가져오기 때문입니다.



마지막으로 속성값을 가져오려면 어떻게 해야 하는가? 7번째 줄을 보세요.

노래 수 : <xsl:value-of select="title/@numberoftracks"/>





title/@numberoftracks에서 @는 속성을 나타냅니다. 즉, <title>엘리먼트의 속성 nuberoftracks의 속성값을 나타내는 것이죠.



분명히 XSL을 적용하지 않은 문서보다는 사용자가 보기 편할 겁니다. 여러분이 한번 이런 XSL 문서를 자유롭게 변경해 보세요.

HTML 바꾸듯이 하면 됩니다.



휴~~ 이것으로 여러분은 XSL에서 사용되는 엘리먼트와 속성의 값을 가져오는 방법. XSL 템플릿의 적용방법, 반복문을 처리하는 방법을 배웠습니다.



XSL은 이것 이외에도 많은 요소를 가지고 있습니다. 조건문이나 기타 다른 형식의 문장도 처리할 수 있습니다.

그러나 이후의 공부는 본인에게 맡기고 오늘은 이정도로 간단히 설명하려고 합니다.



이렇게 해서 기초강좌를 어느정도 마쳤습니다. 다음은 마지막으로 XML의 응용 분야에 대해서 간단히 알아보구요.

XML 기초강좌를 마무리 하려고 합니다. 도움이 됐는지 모르겠군요. 그저 저 혼자 주절주절 떠든건 아닌지.. 쩝~~



담 강좌는 지난번에 말씀 드린 대로 MSSQL에서 XML의 사용법을 진행하려고 합니다.

부족하더라두 이해해주세요.. 그럼.. 2002/08/02  From 미니

=======================================================================
2007/06/08 추가..

이 글에 대해서 나름대로 그림으로 해석을 해준 분이 있어서 링크로 추가합니다.
말로만 되어 있어서 잘 이해가 안되는 분들에게는 좋은 자료가 될 것 같습니다.

http://blog.naver.com/ziziri80?Redirect=Log&logNo=110002413257

그럼.. 좋은 하루 되세요~~

출처 : 미니의 XML DeveloperGroup (http://www.word.pe.kr)

'프로그램언어 > XML' 카테고리의 다른 글

5. DTD & XML  (0) 2008.05.28
4. DTD란?  (0) 2008.05.14
3. XML의 구성요소  (0) 2008.05.14
2. XML의 시작  (0) 2008.05.14
1.1 XML 이란?  (0) 2008.05.14
728x90
5. DTD & XML

오늘은 지난번에 하겠다고 했던 DTD 예제를 가지고 XML문서로 만들어 가는 걸 설명해 드리려고 합니다.



오늘 예제는 제가 MS 사이트에서 가져온 것으로 일반적인 음악 CD에 대한 항목을 나타내는 예제입니다. 해당 소스는 자 에서 받으실 수 있습니다.



먼저 이 문서의 DTD를 살펴보도록 하죠.

1: <!ELEMENT compactdiscs (compactdisc*)>
2:     <!ELEMENT compactdisc (artist, title, tracks, price)>
3:           <!ENTITY % Type "individual | band">
4:           <!ELEMENT artist (#PCDATA)>
5:                  <!ATTLIST artist type (%Type;) #REQUIRED>
6:           <!ELEMENT title (#PCDATA)>
7:                  <!ATTLIST title numberoftracks CDATA #REQUIRED>
8:           <!ELEMENT tracks (track*)>
9:           <!ELEMENT price (#PCDATA)>
10:         <!ELEMENT track (#PCDATA)>





위의 DTD는 다행히도 제가 지난 강좌에서 설명한 엘리먼트와 속성으로 이루어져 있습니다.

실제로 여러 DTD를 보면 무지무지 복잡하게 되어 있습니다. 그러나 기본적으로 꼭 알아야 하는 것이

바로 엘리먼트와 속성입니다. 이 두가지만 잘 파악하고 있으면 어떤 DTD에도 빠르게 적응할 수 있을 겁니다.

번호는 설명을 위해서 제가 붙여놓은 것입니다. 실제 DTD에는 번호가 붙지 않습니다.



여러분이 소스를 테스트 하시려면 반드시 "1:" 이 부분을 모두 삭제하고 사용하시기 바랍니다.



DTD를 한번 쭉 살펴 볼까요?

어라!! 잉~~ 모르는 것이 중간에 하나 끼어 있네요..



3번줄을 보세요... ENTITY라?? 분명 XML 구성요소를 할 때는 설명이 나왔는데 DTD에는 설명이 없었죠.

자~ XML 구성요소에서 설명한 것으로 생각을 해보세요. ENTITY는 텍스트나 Binary 데이터, 비 ASCII 문자열을 대치한다고 했죠.

생각 나세요.. 쿠쿠 제 강좌를 참 잘 따라온 분이네여~~ 생각이 안나시는 분은 앞부분을 참고하세요.



엔터티는 XML 문서에서 사용될 수도 있지만 DTD문서에서도 사용될 수 있습니다.

DTD 문서에서 사용되는 엔터티를 파라미터 엔터티라고 하죠.

우리가 XML에서 엔터티를 사용할 때 < & & 이런 형태로 사용했죠..

DTD에서는 %lt; % %amp;라고 사용을 합니다. 좀 다르죠.. 의미는 거의 비슷하다고 보면 됩니다.



자 그럼.. 위에서 <!ENTITY % Type "individual | band">



은 Type이란 엔터티를 "individual | band"로 바꿔라 라는 의미로 해석하면 됩니다.



그럼 Type이 사용된 곳을 보죠.. 5번째 줄에 보면 %Type; 이란 부분이 있죠. 그부분을 바꿔 주면 됩니다.

즉, 위와 같은 경우 다음 두줄을 이렇게 한줄로 바꿀 수 있습니다. 의미는 같네요. <!ENTITY % Type "individual | band">

<!ATTLIST artist type (%Type;) #REQUIRED>



  <!ATTLIST artist type (individual | band) #REQUIRED>



실제로 소스를 다운 받아서 바꿔서 사용해 보세요. 당연히 됩니다.

참고 : 지난번처럼 하면 안됩니다. 송선희님이 지적해 주셨네요.. 감사합니다. 새롭게 고쳐 놓았습니다.

          %Type; => individul|band 로 바꾸는 거네요. 그래서 위처럼 하셔야 합니다.

          실제로도 XML 스펙에 보면 위와 같은 속성 타입을 열거형이라고 하는데요.

          열거형은 ()로 둘러쌓여 있구요.. |로 구분한다 라고 나와있네요. 죄송함다.. 제가 미리 체크하지 못했네요 T__T



그럼 여기서 당근 질문을 하나 하셔야 합니다. 왜 파라미터 엔터티를 사용하느냐?



그냥 직접 쓰면 되는데?? 그건 우리가 C나 C++에서의 #define을 사용하는 이유와 같습니다.

위에서 Type에 하나가 추가되었다고 보죠. 즉, 지금은 개인과 밴드만이 존재하는데.. 만약 듀엣이 추가된다면??

DTD 전체를 바꿔야겠죠..



그게 복잡한 DTD라면 더욱 머리가 아파지는 거지요.. 하지만 엔터티를 사용했다면 엔터티 선언 부분만 바꾸면 됩니다.

당연히 엔터티의 효용도가 높아 지겠죠. 실제로 많은 DTD가 이 엔터티를 주로 사용합니다.



자, 그럼 계속 가 볼까요?? 우리가 할 일은 위의 DTD를 보구서 XML 문서 하나를 만들어 가는 겁니다.

1번줄을 보세요. <compactdiscs>는 <compactdisc>를 여러번 포함할 수 있습니다. <!ELEMENT compactdiscs (compactdisc*)>



제가 어떻게 여러번 포함될 수 있다는 것을 알았을까요? 그것은 * 때문입니다. 이런 기호들의 의미가 지난 강좌에 소개 됬었죠.



그렇다면 다음처럼 만들어 줄 수 있을 겁니다.

<compactdiscs>

    <compactdisc>

    ...

    </compactdisc>

    <compactdisc>

    ...

    </compactdisc>

</compactdiscs>





그리고 나서 2번의 <compactdisc>를 살펴보죠.. <!ELEMENT compactdisc (artist, title, tracks, price)>



(artist, title, tracks, price)  이렇게 나와 있습니다. 맨 뒤에 아무것도 없으니까 1번 나타난다는 의미고요.

, 로 되어 있으니까 순서대로입니다. 지난번 강좌와 연결해서 이해가 되나요??



그러므로 <compactdisc>는 <artist>, <title>, <tracks>, <price>가 순서대로 나타난다고 보시면 됩니다.

<compactdisc>

    <artist></artist>

    <title></title>

    <tracks></tracks>

    <price></price>

</compactdisc>





자 여기까지 별 어려움이 없죠.. 계속 가보죠..

4번째 줄을 보면 <artist>는 #PCDATA를 가지고 있습니다. <!ELEMENT artist (#PCDATA)>



#PCDATA가 뭐였죠? 파싱된 문자데이터.. 그냥 문자열로 생각하면 편하다고 했죠.

즉, <artist>는 문자열을 자식으로 가지고 있고요.



이어서 5번째 줄을 보세요. <artist>는 속성을 포함하고 있다고 나와 있죠.. <!ATTLIST artist type (%Type;) #REQUIRED>





속성의 이름은 type이고 파라미터 엔터티를 문자열로 바꾸면 "individual | band" 이므로 열거형으로 둘중의 하나를 값으로 가져야 하고요.

그리고 반드시 필요한 속성이라는 것이죠.. 4,5번을 종합해 보면 다음과 같이 작성해야 한다는 거네요..

<artist type="individual">Frank Sinatra</artist>





6번째와 7번째 줄의 <title>도 비슷합니다. <!ELEMENT title (#PCDATA)>
    <!ATTLIST title numberoftracks CDATA #REQUIRED>





자식으로 CD제목을 나타내는 문자열(#PCDATA)를 가지고 있구요. 속성은 문자열 속성을 가진 numberoftracks가 있습니다.

다음과 같은 형태로 작성하면 되죠..

<title numberoftracks="4">In The Wee Small Hours</title>





여기서 잠시 생각할 것이 numberoftracks의 값은 분명 숫자일 것입니다. 그러나 제가 지난번에 설명했듯이 DTD에서 숫자형이란

데이터 타입은 없습니다. 그냥 모두 문자열일 뿐입니다.



8번째 줄과 10번재 줄을 보면 <tracks>는 여러개의 <track>을 포함할 수 있고 <track>은 내용으로 문자열을 넣어주면 됩니다.

<!ELEMENT tracks (track*)>
    <!ELEMENT track (#PCDATA)>





적용해 볼까요? 이런 형태로 사용할 수 있습니다.

<tracks>

    <track>In The Wee Small Hours</track>

    <track>Mood Indigo</track>

    <track>Glad To Be Unhappy</track>

    <track>I Get Along Without You Very Well</track>

</tracks>





마지막으로 9번째 줄을 보면 <price>는 가격 정보를 나타내는 문자열로서 다음처럼 작성하면 됩니다.

<price>$12.99</price>





여기에 XML 문서 선언 부분을 넣구요. DTD를 선언하는 부분도 넣어서 다음처럼 완성할 수 있습니다.

  <?xml version="1.0"?>
<!DOCTYPE compactdiscs SYSTEM "cds.dtd">
<compactdiscs>
  <compactdisc>
    <artist type="individual">Frank Sinatra</artist>
    <title numberoftracks="4">In The Wee Small Hours</title>
    <tracks>
          <track>In The Wee Small Hours</track>
          <track>Mood Indigo</track>      
          <track>Glad To Be Unhappy</track>
          <track>I Get Along Without You Very Well</track>
    </tracks>
    <price>$12.99</price>
  </compactdisc>
  <compactdisc>
    <artist type="band">The Offspring</artist>
    <title numberoftracks="5">Americana</title>
    <tracks>
           <track>Welcome</track>
           <track>Have You Ever</track>  
           <track>Staring At The Sun</track>
           <track>Pretty Fly (For A White Guy)</track>
    </tracks>
    <price>$12.99</price>
  </compactdisc>
</compactdiscs>





DTD가 주어졌을 때 XML 문서를 생성하는 방법을 간단하게 알아보았습니다. 이것을 통해서 DTD를 좀더 편하게 보았으면 해서

제가 강좌로 마련해 보았네요.



실제로 여러분에게 DTD가 주어졌을 때 이런 형식으로 적용할 수 있다면 앞으로 다가올 웹의 변화에 빠르게 적응할 수 있을 겁니다.

왜냐면 지금 시작되고 있는 웹의 변화는 XML을 기반으로 한 DTD에 있다고 볼 수 있으니까요? 넘 거창했나요?? ^^;;

어쨌거나 반대로 만약 XML 문서를 새로이 받았을 때 이 DTD를 공유하고 있다면 의미해석을 더욱 쉽게 할 수 있을 겁니다. 2002/08/02  From 미니

출처 : 미니의 XML DeveloperGroup (http://www.word.pe.kr)

'프로그램언어 > XML' 카테고리의 다른 글

6. XSL & XML  (0) 2008.06.02
4. DTD란?  (0) 2008.05.14
3. XML의 구성요소  (0) 2008.05.14
2. XML의 시작  (0) 2008.05.14
1.1 XML 이란?  (0) 2008.05.14

+ Recent posts