티스토리 뷰

반응형

= devpia 강좌란에서 퍼온 자료임 =

 

 

 

안녕하세요.. 

계속 이금우 입니다.

ㅍ ㅏ ~

사실 같은 날 치는 겁니다..

그럼 이번에는 전편 말미에서 말씀 드렸듯이


1편에서 준비한 XML 문서를 로드하여 파싱하고


그 내용을 보는 것을 간략히 하겠습니다.

-----------------------------------------

XML DOM을 사용하려면


먼저 XML 파서의 인스턴스를 만들어야 합니다. 

이를 위해, Microsoft는 Msxml.dll에 있는


표준 COM 인터페이스 셋을 통해


XML DOM을 익스포즈합니다.


Msxml.dll에는 XML 문서 조작에 필요한


타입 라이브러리와 구현 코드가 들어 있습니다.


클라이언트에서 스크립트를 사용할 때는

(가령, Internet Explorer에서 VBScirpt를 실행하는 경우),


CreateObject 메서드를 통해 Parser 개체의 인스턴스를 


만들면 DOM을 사용할 수 있습니다. 

Set objParser = CreateObject( "Microsoft.XMLDOM" ) 

ASP (Active Server Page)에서 VBScript를 사용하는 경우에는 
Server.CreateObject를 사용하면 됩니다. 

Set objParser = Server.CreateObject( "Microsoft.XMLDOM" ) 

Visual Basic을 사용하는 경우, Msxml.dll에서 제공되는 MSXML 타입 
라이브러리에 대한 참조를 설정하여 DOM을 액세스할 수 있습니다. 
Visual Basic 6.0에서 MSXML을 사용하는 방법은 다음과 같습니다. 

Project References 대화 상자를 엽니다. 
사용 가능한 COM 개체 목록에서 Microsoft XML, 버전 2.0을 선택합니
다. 목록에 이 항목이 없다면, MSXML 라이브러리를 얻어야 합니다. 
Parser 개체의 인스턴스를 만듭니다. 
Dim xDoc As MSXML.DOMDocument Set xDoc = New MSXML.DOMDocument 

MSXML 라이브러리는 다음의 두 가지 방법으로 얻을 수 있습니다. 

먼저 Internet Explorer 5.0을 설치하십시오. 그러면, 필수 컴포넌트
인 MSXML 파서가 함께 설치됩니다. 
재 배포 가능한 Microsoft XML Parser 버전을 다운로드하십시오. 
Visual Basic 프로젝트 안에 타입 라이브러리 참조를 설정한 후에, 파
서를 호출하고, 문서를 로드하여 문서 안의 데이터를 조작합니다. 

Visual Basic 6.0 Object Browser를 사용하여 MSXML 라이브러리를 열
어 보면, 그 안에 상당히 다양한 개체 모델이 있는 것을 알 수 있습니
다. 이 기사에서는, DOMDocument 클래스와 IXMLDOMNode 인터페이스를 
사용하여 XML 문서를 액세스하는 방법에 대해 알아보겠습니다.

(참고 여기서 Visual Basic 6.0 Object Browser 는여.. 비졀베이직에
서 F2 누르면 튀어 나오는 녀석 있져.. 그것입니다..)

거기서 MSXML 을 선택하면 우리가 이용할 수 있는 것을 볼 수 있습니
다.

XML 문서를 로드하려면, 먼저 DOMDocument 클래스의 인스턴스를 만들
어야 합니다.

Dim xDoc As MSXML.DOMDocument
Set xDoc = New MSXML.DOMDocument

문서에 대한 유효 참조를 얻은 다음, Load 메서드를 사용하여 문서를 
엽니다. MSXML 파서는 로컬 디스크에 있는 XML 문서를 로드할 수도 있
고, UNC 참조나 URL을 사용하여 네트워크를 통해 문서를 로드할 수도 
있습니다. 

디스크에 있는 문서를 로드하는 경우에는, 다음과 같이 Load 메서드
를 사용합니다. 

If xDoc.Load("C:\My Documents\cds.xml") Then
     The document loaded successfully.
     Now do something intersting.
Else
     The document failed to load.
End If

MSXML 파서는 명시적인 Close 메서드를 익스포즈하지 않으므로, 문서
에서 작업을 모두 마친 후에는 그 문서에 대한 개체 참조를 해제해야 
합니다. 가장 좋은 방법은 다음과 같이 개체 참조를 Nothing으로 설정
하는 것입니다. 

Set xDoc = Nothing

여러분이 파서에 파일 로드를 요청하면, 파서는 기본 설정에 의해 비
동기적으로 그 작업을 수행합니다. 이러한 작동(behavior)을 변경하
고 싶으면, 문서의 Boolean Async 속성을 바꾸어야 합니다. 문서의 내
용을 보기 전에 문서의 ReadyState 속성을 검사하면 문서가 준비되었
는지 확인할 수 있습니다. ReadyState 속성은 아래에 나와 있는 5개
의 값 중 하나를 반환합니다


상   태 값 
Uninitialized(초기화되지 않음): 아직 로드가 시작되지 않았음. 0 
Loading(로드중): 로드 메서드가 실행중임. 1 
Loaded(로드됨): 로드 메서드가 완료됨. 2 
Interactive: DOM을 읽기 전용 검색으로만 사용할 수 있고 데이터가 
부분적으로만 파싱되었음. 3 
Completed(완료): 데이터 로드 및 파싱이 완료되었으며, 읽기/쓰기 연
산에 사용할 수 있음.  4 

MSXML 파서는 용량이 큰 문서를 로드할 때 로드 상태를 추적할 수 있
는 이벤트를 익스포즈합니다. 이 이벤트는 URL에 있는 문서를 
Internet을 통해 비동기적으로 로드하는 경우에도 매우 유용합니다. 

URL에 있는 파일을 열려면, 완전한 형식의 URL을 사용하여 파일의 위
치를 지정해야 합니다. 파일의 위치를 지정할 때는 반드시 앞에 
http://를 붙여야 합니다. 

URL에 있는 파일을 로드하는 예는 다음과 같습니다. 

xDoc.async = False
If xDoc.Load("http://www.develop.com/hp/brianr/cds.xml") Then
     The document loaded successfully.
     Now do something intersting.
Else
     The document failed to load.
End If

문서의 Async 속성을 False로 설정하면, 파서는 문서가 완전히 로드되
고 조작할 준비가 될 때까지 코드에 대한 제어를 반환하지 않습니다. 
Async 속성이 True일 때는, 문서를 액세스하기 전에 ReadyState 속성
을 검사하거나 DOMDocument의 이벤트를 사용하여 문서가 준비되었을 
때 코드가 통보를 받게 해야 합니다.


문서를 로드한 다음에는, 그 안에 있는 정보를 검색합니다. 문서 안
의 정보를 검색할 때는 문서 개체를 사용하기도 하지만, 실제로는 
IXMLDOMNode 인터페이스를 더 많이 사용합니다. IXMLDOMNode 인터페이
스를 사용하면 개별적인 노드 요소를 읽고 작성할 수 있습니다. 
MSXML 파서는 현재 13개의 노드 타입을 지원합니다. 그 중에서도 가
장 일반적으로 사용되는 노트 타입이 아래 표에 정리되어 있습니다. 

DOM 노드 타입 예 
NODE_ELEMENT <   artist type="band"> The Offspring<   /artist>  
NODE_ATTRIBUTE type="band"> The Offspring 
NODE_TEXT The Offspring 
NODE_PROCESSING_INSTRUCTION <   ?xml version="1.0"?>  
NODE_DOCUMENT_TYPE <   !DOCTYPE compactdiscs SYSTEM "cds.dtd">  

노드 타입은 IXMLDOMNode 인터페이스가 제공하는 두 가지 속성을 통
해 액세스할 수 있습니다. NodeType 속성은 DOMNodeType 항목(그 중 
일부가 위의 표에 나와 있음)을 열거하는 데 사용하고, 
NodeTypeString은 노드 타입에 대한 텍스트 문자열을 검색하는 데 사
용합니다. 

O일단 문서에 대한 참조를 얻고 나면, 노드 계층 구조를 탐색할 수 있
습니다. 문서 참조의 ChildNodes 속성을 액세스하면, 문서에 있는 모
든 노드에 대한 하향식 엔트리 포인트를 얻을 수 있습니다. 
ChildNodes 속성은 Visual Basic For/Each construct를 지원하는 
IXMLDOMNodeList를 익스포즈합니다. 이 IXMLDOMNodeList를 사용하면, 
ChildNodes의 각 노드를 모두 열거할 수 있습니다. 또한, ChildNoes 
속성은 존재하는 자식 노드의 개수를 반환하는 Level 속성도 익스포즈
합니다. 

문서 개체도 ChildNodes 속성을 익스포즈하지만, 각 노드도 
ChildNodes 속성을 익스포즈합니다. 여러분은 ChildNodes 속성과 
HasChildNodes 속성을 통해 노드 계층 구조를 더 쉽게 탐색할 수 있습
니다.

한 가지 주의할 것은 문서 요소와 그 요소의 값 사이에 부모-자식 관
계가 성립된다는 것입니다. CD XML 문서를 예로 들면, <   title>  요소
는 노래 제목을 익스포즈합니다. 이 때, <   title>  요소의 실제 값을 검
색하려면, NODE_TEXT 타입의 노드를 찾아야 합니다. 원하는 데이터를 
갖고 있는 노드를 찾으면, 그 노드의 애트리뷰트를 검사할 수 있음은 
물론 ParentNode 속성을 통해 그 노드의 부모 노드도 액세스할 수 있
습니다. 

문서는 어떻게 탐색하는가?
이제 XML 문서에서 문서 개체에 의해 익스포즈되는 노드를 어떻게 탐
색하는지 알아 봅시다. XML 문서는 계층 구조적 특성을 갖고 있기 때
문에, 문서 전체를 탐색하는 반복 루틴을 작성하기가 비교적 쉽습니
다. 

TLoadDocument 루틴은 XML 문서를 연 다음, DisplayNode라는 또 다른 
루틴을 호출합니다. 실제로 문서를 탐색하는 것은 바로 이 
DisplayNode입니다. LoadDocument는 현재 열려 있는 XML 문서의 
ChildNodes 속성에 대한 참조와 행 들여쓰기(indent) 레벨의 시작 위
치를 지정하는 정수 값을 매개 변수로 전달합니다. LoadDocument 코드
는 Indent 매개 변수를 사용하여 문서 구조에 대한 Visual Basic 
Immediate Window에 있는 텍스트의 디스플레이 형식을 지정합니다. 

DisplayNode 함수는 NODE_TEXT 타입의 노드를 찾아 문서를 탐색합니
다. DisplayNode 는 NODE_TEXT 타입의 노드를 찾으면, NodeValue 속성
을 사용하여 그 노드의 텍스트를 검색합니다. 또한, 현재 노드의 
ParentNode 속성을 사용하여 NODE_ELEMENT 타입의 노드에 대한 백-참
조를 얻습니다. NODE_ELEMENT 타입의 노드는 NodeName 속성을 익스포
즈합니다. NodeName과 NodeValue의 내용이 디스플레이됩니다.

DisplayNode는 HasChildNodes 속성을 검사하여 노드가 자식 노드를 갖
고 있는지를 알아내고, 만약 자식 노드가 있으면, 문서의 끝에 도달
할 때까지 자기 자신을 반복적으로 호출합니다. 

DisplayNode 루틴은 Debug.Print를 사용하여 Visual Basic의 
Immediate 창에 정보를 작성합니다. 

---------------------------------------------------------------
Public Sub LoadDocument()
Dim xDoc As MSXML.DOMDocument
Set xDoc = New MSXML.DOMDocument
xDoc.validateOnParse = False
If xDoc.Load("C:\My Documents\sample.xml") Then
     The document loaded successfully.
     Now do something intersting.
    DisplayNode xDoc.childNodes, 0
Else
     The document failed to load.
     See the previous listing for error information.
End If
End Sub

Public Sub DisplayNode(ByRef Nodes As MSXML.IXMLDOMNodeList, _ 
    ByVal Indent As Integer)
    
    Dim xNode As MSXML.IXMLDOMNode
    Indent = Indent + 2

    For Each xNode In Nodes
        If xNode.nodeType = NODE_TEXT Then
            Debug.Print Space$(Indent) & 
xNode.parentNode.nodeName & _
                ":" & xNode.nodeValue
        End If

        If xNode.hasChildNodes Then
            DisplayNode xNode.childNodes, Indent
        End If
    Next xNode
End Sub

----------------------------------------------------------------

DisplayNode는 HasChildNodes 속성을 사용하여 자기 자신을 다시 호출
해야 하는지 결정하고, 노드의 Level 속성 값이 0보다 큰지 검사하여 
자식 노드 존재 여부를 확인할 수도 있습니다. 

=============================================================

이상으로 2번째를 마치구여.. 3번째에는 오류처리에 대해 올립죠..

ㅍ ㅏ ~

참고로 이 강좌는 MSDN 온라인 강좌를 참고하여 제작하였습니다.

이금우

블로그코리아에 블UP하기

반응형
댓글
반응형
05-17 05:57
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함