Parser 와 DOM 기초

  • Parser
    • XML 문서를 읽고 해석 : well-formed, valid 검사
    • 응용 개발시 파서 사용 이유 : 세부적인 XML 문법으로부터 프로그램 격리
         XML 문서 --> [파서] -->인터페이스--> [응용 프로그램]
    • 파서가 메모리에 DOM 트리를 생성 : XML 문서트리와 일치
  • 표준 API
    • DOM : 객체 기반 (Object-based) Interface
      - 메모리 상주 트리 이용, 응용에서 간단히 사용, p.208
    • SAX : 이벤트 기반 (Event-driven) Interface
      - 파서가 간단, 응용프로그램은 복잡
  • DOM 개요
    • 문서내 객체(element)를 조작하기 위한 인터페이스(API)
      -
      DOM level 1 : ’98.10 W3C Recommendation
      - DOM level 2 : 2000.11 W3C Recommendation
      - DOM level 3 : 2001.8 W3C Working Draft
    • 문서 전체가 아닌 문서 일부분에 대한 접근 가능
    • 대상 문서 : XML1.0 또는 HTML4.0
  • DOM의 역할
    • 구조의 탐색 : 각 요소와 속성에 대한 탐색/질의가 가능
    • 문서 구조의 조작 : 문서 구조에서 요소, 속성의 추가/수정/삭제가 가능
    • 컨텐츠의 조작 : 문서 요소에서 text 등 컨텐츠의 탐색/추가/수정/삭제가 가능

Document 객체

  • DOMDocument 객체 생성 및 읽기
    • Msxml2.DOMDocument 객체
    • async 속성, load 메쏘드, xml 속성
    MSXML 파서 설치할 경우   MSXML 파서 설치안한 경우  
    <HTML>
    <HEAD>
    <Script language="Javascript">
    function xload0()
    {
        var xmldoc = new
            ActiveXObject("Msxml2.DOMDocument");
        xmldoc.async = false;    xmldoc.load("ex07a.xml");
        alert(xmldoc.xml);
    }
    </script>
    </HEAD>
    <BODY>
    <input type="button" value="XML 로드0"
        onClick="xload0()">
    </BODY>
    </HTML>
     
    111<HTML>
    <HEAD>
    <Script language="Javascript">
    function xload1()
    {
        xmldoc.async = false;
        xmldoc.load("ex07a.xml");

        alert(xmldoc.xml);
    }
    </script>
    </HEAD>
    <BODY>
    <input type="button" value="XML 로드1"
        onClick="xload1()">
    <xml id="xmldoc"></xml>
    </BODY>
    </HTML>
    VBScript 의 경우
    <Script language="VbScript">
      Dim xmldoc
      Set xmldoc = CreateObject("Msxml2.DOMDocument")
      xmldoc.async = False;
      xmldoc.load("ex07a.xml");
      MsgBox xmldoc.xml
    </Script>
  • 신규 문서 작성 : loadXML 메쏘드
     xmldoc.async = false;
     xmldoc.loadXML( "<book><title>XML 입문</title><author>일지매</author></book>");
     alert(xmldoc.xml);
     
     xmldoc.async = false;
     xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");
     alert(xmldoc.xml);
     
  • 공백의 처리 : preserveWhiteSpace 속성
     xmldoc.async = false;
     xmldoc.preserveWhiteSpace = true;
     xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");
     alert(xmldoc.xml);
     
     xmldoc.async = false;
     xmldoc.preserveWhiteSpace = true;
     xmldoc.load("ex07a.xml");
     alert(xmldoc.xml);
     
  • XML 문서의 저장 : save 메쏘드
  • 에러 처리 : parseError, parseError.line, parseError.linepos, parseError.reason
     xmldoc.async = false;
     xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </authors> </book>");
     alert(xmldoc.xml);
     
     xmldoc.async = false;
     xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </authors> </book>");
     if (xmldoc.parseError)
        alert("에러 위치 : " + xmldoc.parseError.line + "번째 라인 " + xmldoc.parseError.linepos 
                  + "번째 문자\n\n에러 이유 : " + xmldoc.parseError.reason);
     else
    alert(xmldoc.xml);
     
  • 루트 노드 찾기 : documentElement 속성
     xmldoc.async = false;
     xmldoc.load("ex07a.xml");
     var xmlroot = xmldoc.documentElement;
     alert(xmlroot.nodeName);
     
     xmldoc.async = false;
     xmldoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");

     var xmlroot = xmldoc.documentElement;
     alert(xmlroot.nodeName);

     
  • 임의의 노드 찾기 : getElementsByTagName("tagName")
  • 노드의 추가 메쏘드 : 뒤에 설명
    • createElement(name), createTextNode(data), createAttribute(name), createComment(data), createProcessingInstruction(target,data), createCDATASection(data), createEntityReference(name)

Node 객체

  • nodeName, nodeType, nodeValue, attributes, text 속성
    • nodeType = 1(element), 2(attribute), 3(text) , 4(CDATA), ...  : 표7.1 [p.215]
     xmldoc.load("ex07a.xml");
     var xmlroot = xmldoc.documentElement;
     alert('nodeName: '+xmlroot.nodeName+'\nnodeType: '+xmlroot.nodeType+
           '\nnodeValue: '+xmlroot.nodeValue+'\nattributes: '+xmlroot.attributes.length);
     alert(xmlroot.text);
     
  • Node의 운행(Traversal) 관련 속성
    • 관련속성
                                  -- previousSibling 
      ...  parentNode  -- **현재노드**    --  childNodes [ firstChild, … , lastChild ]
                                  -- nextSibling 
    • hasChildNodes() 메쏘드
  • NodeList 객체
    • length 속성, item(번호) 메쏘드
     xmldoc.load("ex07a.xml");
     var xmlroot = xmldoc.documentElement;
     if (xmlroot.hasChildNodes) {
         alert(xmlroot.childNodes.length);
         var curr = xmlroot.firstChild;
         alert(curr.xml);
         alert(curr.nodeName + curr.nodeType
          +curr.nodeValue+curr.attributes.length);
     }
     else alert('No Child');
     
     xmldoc.load("ex07a.xml");
     var xmlroot = xmldoc.documentElement;
     var curr = xmlroot.firstChild.nextSibling;
     alert(curr.xml);
     curr = curr.childNodes.item(2);
     alert(curr.xml);
     curr = curr.previousSibling;
     alert(curr.text);
     alert(curr.nodeName + curr.nodeType
          +curr.nodeValue+curr.attributes.length);
     
  • NamedNodeMap 객체 
    • getNamedItem("속성명"), setNamedItem(), removeNamedItem() 메쏘드
  • Attribute 객체 
    • name, value, specified 속성
     xmldoc.load("ex07a.xml");
     var attrs = xmlroot.firstChild.attributes;
     var attr0 = attrs.getNamedItem("InStock");
     alert(attr0.name + attr0.value + attr0.specified); 
  • 노드의 추가/삭제/수정 메쏘드 : 뒤에 설명
    • appendChild(child), insertBefore(child,before), removeChild(child),
      replaceChild(child,toReplace), cloneNode(deep)

임의 노드의 검색

  • 그 이름으로 검색
    • 노드리스트 = 문서.getElementsByTagName("tagName");
     xmldoc.load("ex07a.xml");
     var nlist =
       xmldoc.
    getElementsByTagName("book");
     for (i=0; i<nlist.length; i++)
            alert(nlist.item(i).xml);
     
     xmldoc.load("ex07a.xml");
     var nlist =
        xmldoc.
    getElementsByTagName("title");
     for (i=0; i<nlist.length; i++)
            alert(nlist.item(i).xml);
     
  • 패턴으로 검색
    • 노드리스트 = 노드.selectNode("query");
    • 노드 = 노드.selectSingleNode("query");
     xmldoc.load("ex07a.xml");
     var xroot = xmldoc.documentElement;
     var node1 = xroot.selectSingleNode("title");
     alert(node1.text);
     var tlist = xroot.selectNodes('//title');
     var alist = xroot.selectNodes('//author');
     for (i=0; i<alist.length; i++)  
        alert('['+i+'] '+alist.item(i).text+', '
               +tlist.item(i).text);

     
     xmldoc.load("ex07a.xml");
     var xroot = xmldoc.documentElement;
     var node1 = xroot.
        selectSingleNode
    ('//book[@InStock=0]');
     alert(node1.xml+'\n=> 재고가 없습니다.');
     var tlist = xroot.
        selectNodes
    ('//book[@InStock!=0]/title');
     for (i=0; i<tlist.length; i++)
        alert(tlist.item(i).text+'\n=>재고 있음.');

     

 

펌 -  http://mm.sookmyung.ac.kr/~sblim/lec/xml-int02/

MSDN - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/dom_reference.asp

Posted by 나비:D
:
BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
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
Total :
Today : Yesterday :