달력

4

« 2024/4 »

  • 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
2007. 2. 14. 17:48

04. DOM의 활용(고급편) 그거/Tech2007. 2. 14. 17:48

- 문서 내 노드를 추출하는 방법
  . NodeList를 생성한 후, 이 list의 길이만큼 반복하여 list에 저장된 노드들을 추출
    : 우선 루트 엘리먼트의 자식 엘리먼트들에 대한 NodeList를 생성하고, 이 list의 길이만큼 for 문을 반복적으로 수행
   for( int i = 0 ; i < childNodeList.getLength() ; i++ ) {
     Node thisNode = childNodeList.item(i);
  ....
   }
  . 노드의 형제 관계성을 통하여 추출
    : 먼저 첫 번째 자식 노드에 접근한 후, 접근한 노드의 형제 노드로 이동하고, 더 이상 이동할 형제 노드가 없을 때 까지 반복된다.
   for( Node child = root.getFirstChild() ; child != null ; child = child.getNextSibling() ) {
     Node thisNode = node;
   }

- DOM 트리의 모든 노드들의 노드 타입과 이름, 값을 출력
  public void stepThrouch(Node thisNode) {
    int type = thisNode.getNodeType();
    String name = thisNode.getNodeName();
    String value = thisNode.getNodeValue();

 for(Node child = thisNode.getFirstChild() ; child != null ; ) {
   child = child.getNextSibling();
   stepThrouch(child);
 }
  }

  (9) #document:null   <--- 문서 자체
  (10) airlocksystem:null <-- DOCTYPE 선언
  (7)xml-stylesheet:href="airlocks.xsl" type="text/xsl" <--스타일 시트 선언
  (1)airlocksystem:null <-- root element
  (3)#text:

  (1)airlock:null
  (3)#text:

  (1)size:null
  (3)#text:

  (1)type:null
  (3)#text:Bronson
  (3)#text:

  (1)location:null
  (3)#text:Level 2 aft
  (3)#text:

  (1)status:null
  (3)#text:open
  (3)#text:

  (1)maintenance:null
  ....


- 정규화와 규범화
  정규화 : 텍스트 노드의 문제를 해결하기 위해서 일정한 형식을 만족하도록 XML 문서를 구성하는 작업
  규범화 : 동일한 정보에 대한 서로 다른 표현들에 대허서 XML의 처리에 도움을 주고, XML 문서 자체에서는 명시되지 않은 표현의 차이에 대해서 동일 정보에 대한 동일 표현을 가지도록 한다.
    규범적 XML 문서의 조건
 . XML 선언부와 DTD는 반드시 제거되어야 한다.
 . attribute는 알파벳 순서에 맞추어 정렬한다.
 . namespace 선언문은 적용 가능한 모든 element의 집합 중에서 가장 바깥쪽의 element에만 정의한다.
 . text node에서 <, &, >, #xD 등의 문자들은 각각 &lt; &amp; &gt; &#xD;로 대체한다.
 . attribute node에서 <, &, " 등의 문자들은 각각 &lt; &amp; &quot 등으로 대체한다.
 . element의 시작 태그 내에 있는 공백 문자들은 모두 삭제되어야 한다.


- DOM level 2.0 Traversal
  DOM 트리를 순회하는 기능을 제공

  Node root = doc.getDocumentElement();
  DocumentTraversal traversal = (DocumentTraversal)doc;
  NodeIterator nodeItrator = traversal.createNodeIterator(1, 2, 3, false);
   
 createNodeIterator(1, 2, 3, false);
    1 : 순회할 노드
 2 : 상수 필터, NodeFilter.SHOW_ALL = 모든 노드를 포함하여 순회
                NodeFilter.SHOW_ELEMENT = 요소만 순회
       NodeFilter.SHOW_TEXT = 텍스트 노드만 순회
    3 : NodeFilter 구현 객체
 false : entity 참조의 실제값을 분석할 것인가?
  
 class FormattingNodeFilter implements NodeFilter {
  public short acceptNode(Node n) {
   if (n.getNodeType() == Node.TEXT_NODE) {
    Node parent = n.getParentNode();

    if ((parent.getNodeName().equalsIgnoreCase("b")) ||
     (parent.getNodeName().equalsIgnoreCase("i"))) {
     return FILTER_ACCEPT;
    }
   }

   return FILTER_SKIP;
  }
 }
 aceptNode(Node n);
 NodeFilter.FILTER_SKIP = 필터로 들어온 노드는 건너뛰고 그 자식노드를 계속 탐색
 NodeFilter.FILTER_REJECT = 필터로 들어온 노드와 그 자식 모두 건너뜀
 NodeFilter.FILTER_ACCEPT = 필터로 들어온 노드 사용

- DOM level 3.0 Load and Save
  XML 문서의 적재
   1. factory method를 포함하는 DOMImplementationLS를 생성한다.
   2. DOMBuilder를 생성한다.
   3. 소스를 명시하기 위해 DOMInput을 생성한다.
   4. DOMInput으로 명시된 소스 문서를 파싱하기 위해 DOMBuilder를 사용하고, DOM Document를 반환한다.

   DOMImplementationLS DOMLS = new DOMImplementationImpl();
   DOMBuilder db = DOMLS.createDOMBuilder(1);
   DOMInputSource dinput = DOMLS.createDOMInputSource();
   dinput.setSystemId("airlocks.xml");
   doc = db.parse(dinput);

  XML 문서의 저장
   DOMWriter dw = DOMLS.createDOMWriter();
   DOMOutputStream doutput = DOMLS.createDOMOutputStream();
   doutput.setSystemId("output.xml");
   dw.writeNode(doutput, doc.getDocumentElement());

'그거 > Tech' 카테고리의 다른 글

06. XML 문서에 대한 유효성 검증  (0) 2007.02.15
05. XML 스트림 (SAX)  (0) 2007.02.14
03. XML 문서의 처리 - DOM  (0) 2007.02.14
02. XML 문서와 application의 설계  (0) 2007.02.14
01. XML 문서의 기본 구조  (0) 2007.02.14
:
Posted by 뽀기