'3. Implementation/Markup Language'에 해당되는 글 11건

  1. 2012.04.20 XPath Axes
  2. 2009.05.07 초급 DTD 사용 예제
  3. 2009.04.21 xsl:call-template 예제
  4. 2008.08.31 RMI 개요
  5. 2008.08.31 XML-RPC
  6. 2008.08.30 JDOM의 등장
  7. 2008.08.30 SAX 핸들러 구현
  8. 2008.08.30 XML 문서 편집
  9. 2008.08.30 XML 문서 읽기
  10. 2008.08.30 DOM API 계층 구조
  11. 2008.08.07 XML 파서의 종류
2012. 4. 20. 05:20

XPath Axes

XML 을 꽤 오랫동안 사용해 왔지만 늘 사용하는 것만 사용하게 되는 것 같습니다. XPath 에서 사용할 수 있는 축에 대해서 소개하는 글입니다. 


출처: http://www.w3schools.com/xpath/xpath_axes.asp


AxisNameResult
ancestorSelects all ancestors (parent, grandparent, etc.) of the current node
ancestor-or-selfSelects all ancestors (parent, grandparent, etc.) of the current node and the current node itself
attributeSelects all attributes of the current node
childSelects all children of the current node
descendantSelects all descendants (children, grandchildren, etc.) of the current node
descendant-or-selfSelects all descendants (children, grandchildren, etc.) of the current node and the current node itself
followingSelects everything in the document after the closing tag of the current node
following-siblingSelects all siblings after the current node
namespaceSelects all namespace nodes of the current node
parentSelects the parent of the current node
precedingSelects all nodes that appear before the current node in the document, except ancestors, attribute nodes and namespace nodes
preceding-siblingSelects all siblings before the current node
selfSelects the current node

2009. 5. 7. 19:43

초급 DTD 사용 예제

source.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE Employees SYSTEM "spec.dtd" >

<Employees>

        <Employee name="길동" age="34" sex="Male" >

               <Department dptID="&DPT_DEVELOP;">&DPT_DEVELOP_STR;</Department>

        </Employee>           

        <Employee name="심청이" age="29" sex="Female" >

               <Department dptID="&DPT_SALES;">&DPT_SALES_STR;</Department>

        </Employee>

        <Employee name="장보고" age="42" sex="Male" >

               <Department dptID="&DPT_TRADE;">&DPT_TRADE_STR;</Department>

        </Employee>

</Employees>


spec.dtd

<?xml version="1.0" encoding="UTF-8"?>

 

<!-- 파라미터 -->

<!ENTITY % varSex "Male|Female">

 

<!ENTITY DPT_DEVELOP                  "0" >

<!ENTITY DPT_DEVELOP_STR      "개발" >

 

<!ENTITY DPT_SALES                    "1" >

<!ENTITY DPT_SALES_STR "영업" >

 

<!ENTITY DPT_TRADE                    "2" >

<!ENTITY DPT_TRADE_STR "무역" >

 

<!ELEMENT Employees (Employee*)>

        <!ELEMENT Employee (Department)>

        <!ATTLIST Employee

               name CDATA #REQUIRED

               age CDATA #REQUIRED

               sex (%varSex;) #REQUIRED

               hobby CDATA #IMPLIED

        >

               <!ELEMENT Department (#PCDATA) >

               <!ATTLIST Department

                       dptID CDATA #REQUIRED

               >


< 참고 >
컨텐츠 변경자(modifier) : 엘리먼트 출현 빈도 설정

? : 0 또는 1회
+ : 1 또는 무한대
* : 0 또는 무한대

엘리먼트 선택자 :

, : And, 반드시 순서대로 나와야 한다.
ex) <!ELEMENT instruments (violin, glockenspiel) >
| : Or, 임의의 하나가 나오면 됨
ex) <!ELEMENT performance (piece | improv) >

Html



Keywords : !ENTITY, !ELEMENT, !ATTLIST, #PCDATA, CDATA

참고 : XML 기초 플러스 (성안당)
2009. 4. 21. 08:36

xsl:call-template 예제

persons.xml

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="makeTable.xsl"?>

<Persons>

        <Person name="Tom" age="19" department="Sales" />

        <Person name="Jane" age="23" department="Development" />

        <Person name="Sam" age="14" department="HumanResource" />

        <Person name="Paul" age="40" department="Sales" />

        <Person name="Kazuya" age="28" department="HumanResource" />

        <Person name="Baek doo san" age="32" department="Development" />

</Persons>



makeTable.xml
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

        <xsl:template match="/Persons">

               <table border="1" cellpadding="1" cellspacing="1">

                       <xsl:apply-templates select="/Persons/Person"/>

               </table>

        </xsl:template>

       

        <xsl:template match="/Persons/Person">

               <xsl:call-template name="makeTable">

                       <xsl:with-param name="age">

                              <xsl:value-of select="./@age"/>

                       </xsl:with-param>

                       <xsl:with-param name="department">

                              <xsl:value-of select="./@department"/>

                       </xsl:with-param>

               </xsl:call-template>

        </xsl:template>

       

        <xsl:template name="makeTable">

               <xsl:param name="age"/>

               <xsl:param name="department"/>

               <tr>

               <td>

                       <xsl:element name="font" >

                              <xsl:attribute name="color">blue</xsl:attribute>

                              <xsl:value-of select="./@name" />

                       </xsl:element>

               </td>

               <td>

                       <xsl:value-of select="$age" />

               </td>

               <td>

                       <xsl:choose>

                              <xsl:when test="$age > 20">Adult</xsl:when>

                              <xsl:otherwise>Student</xsl:otherwise>

                       </xsl:choose>

               </td>

               <td>

                       <xsl:value-of select="$department" />

               </td>

               <td>

                       <xsl:choose>

                              <xsl:when test="$department='Development'"><xsl:text disable-output-escaping="yes">Hard&amp;nbsp;Work</xsl:text></xsl:when>

                              <xsl:otherwise>Easy</xsl:otherwise>

                       </xsl:choose>

               </td>

               </tr>

        </xsl:template>

</xsl:stylesheet>



결과 화면

Tom 19 Student Sales Easy
Jane 23 Adult Development Hard Work
Sam 14 Student HumanResource Easy
Paul 40 Adult Sales Easy
Kazuya 28 Adult HumanResource Easy
Baek doo san 32 Adult Development Hard Work


keywords : xsl:template; xsl:call-template; xsl:with-param; xsl:param; xsl:choose; xsl:text
2008. 8. 31. 00:56

RMI 개요

RMI (Remote Method Invocation) 기술

 

RMI의 개요

다른 Java 인터프리터 상에 생성되어 있는 리모트 객체에 접근하여 원하는 메서드를 실행하고 그 결과를 리턴받는 기능을 구현하는 기술입니다.

 

UNIX에서 지원한 RPC의 장점을 살리고 CORBA 스펙을 적용하여 Java만의 분산 객체 어플리케이션을 쉽게 만들 수 있는 개념을 제시했는데 이것이 바로 RMI(Remote Method Invocation)입니다.


사용자 삽입 이미지

 

RMI의 구성요소

l  리모트 클래스

리모트 객체로 생성될 수 있는 클래스, 리모트에서 호출 가능한 메서드를 정의하고 있는어야 함

l  RMI 서버

리모트에서도 참조 가능한 객체를 생성하고 등록하는 기능의 프로그램

l  RMI 클라이언트

리모트의 객체를 참조하여 필요한 기능을 분산 처리하려는 프로그램

l  RMI Naming Server

리모트 객체를 이름정보로 등록하고 찾아 주는 프로그램

 

RMI의 수행 흐름

1.     등록

RMI 서버가 리모트 클래스의 객체를 생성하여 RMI Naming Server에 등록

2.     요청

RMI 클라이언트가 RMI Naming Server에서 리모트 객체를 요청하여 찾음

3.     RMI

필요한 리코트 메서드를 호출


사용자 삽입 이미지
 


출처 : e-Campus 강좌 중에서

2008. 8. 31. 00:37

XML-RPC

1.     분산 환경에서의 통신 방법

l  메시지 전달방식(message passing)

Socket

: 메시지를 전달하는 것이 하나의 프로세스

l  요청/응답방식(request/response)

HTTP, RPC, CORBA, DCOM, RMI

: 메시지를 전달(request)하고 결과(response)를 되돌려 받는 것이 하나의 프로세스

à 내부적인 함수 호출과 동일한 방식 가능

 

2.     RPC(Remote Procedure Call)

한 프로그램이 네트워크상의 다른 컴퓨터에 위치하고 있는 프로그램에 서비스를 요청하는데 사용되는 프로토콜이다.

 

같은 프로그램내의 함수(Procedure)를 호출하는 것과 같이 원격 프로그램내의 함수를 호출해서 결과를 받는다.

 

요청하는 프로그램이 원격 절차의 처리 결과가 반환 될 때 까지 일시 정지되어야 하는 동기식 운영이다.

 

ORPC(Object RPC)는 객체지향 개념을 도입한 RPC로서 객체의 메소드를 호출하고 파라미터로 객체를 직접 전송한다.

 

3.     XML-RPC

XML 기반의 분산 시스템 통신방법으로서 HTTP를 통하여 간단하고 이식성 높은 원격 프로시저 호출을 지원한다. 리모트 프로시저의 호출에 대하여 XML 형태로 매개변수나 리턴값을 인코딩한다.

 

 

사용자 삽입 이미지

 

l  구현 언어 중립 기술

à XML-RPC Perl, Java, C, C++, PHP와 그 외 다른 많은 언어로 사용할 수 있으며 Unix, Windows, 그리고 Macintosh에서 실행할 수 있다.

 

l  XML-RPC의 통과 방식


사용자 삽입 이미지
 

4.     지원되는 데이터 유형

l  XML-RPC이 지원하는 데이터형

int(i4)

부호 있는 32비트 정수형

string

NULL 바이트를 포함할 수 있는 아스키 문자열

(일부에서는 유니코드를 지원함)

Boolean

참 또는 거짓

double

배정도 실수형

dataTime.iso8601

날짜와 시각. XML-RPC는 타임존의 사용을 금하기 때문에 거의 쓸모 없음

base64

임의의 길이를 가지는 저수준 이진 데이터

array

1차원 배열. 배열 값은 어떠한 형도 가능함

struct

key-value의 쌍으로 이루어진 구조체형

 

l  XML-RPC 데이터 유형과 전달되는 유형

XML-RPC 데이터형

파서에 의해 생성되는 데이터형

핸들러에 정의된 유형

<i4> or <int>

<Boolean>

<string>

<double>

<dateTime.iso8601>

<struct>

<array>

<base64>

java.lang.Integer

java.lang.Boolean

java.lang.String

java.lang.Double

java.util.Date

java.util.Hashtable

java.util.Vector

byte[ ]

int

bolean

java.lang.String

double

java.util.Date

java.util.Hashtable

java.util.Vector

byte[ ]

 

5.     XML-PRC 외의 다른 프로토콜

l  SOAP

SOAP XML-PRC와 매우 유사하며 XML-PRC를 발전/표준화시킨 기술이다.

 

SOAP 역시 HTTP XML 문서를 통해 프로시저를 호출한다.

 

최초의 공개 릴리즈는 XML-RPC의 기본이 되고 있으며 네임스페이스와 긴 요소 이름을 사용할 수 있도록 하였다.

 

W3C Working group SOAP에 의해 여러 다양한 기능들이 추가되었다.

 

SOAP XML Schemas, enumerations, struct array의 혼합, 그리고 사용자 정의 데이터 유형등을 지원한다. 플랫폼에 따라 몇 가지 형태의 SOAP이 제시되었다.

 

XML-RPC와 유사하지만 더 많은 기능을 지원하는 프로토콜을 찾는다면 SOAP을 고려한다.

 

6.     XML-RPC의 장점

HTTP를 이용하므로 Web 상의 모든 종류의 어플리케이션과 상호 동작이 가능하며 객체 기반의 통신을 가느하게 한다.

 

독자적인 HTTP 서버 클래스로도 사용 가능하다.

간단한 구조로 인해서 성능이 향상되며 구현이 간단하고 용이하다.

 

플랫폼 및 개발 언어에 독립적이며 상대적으로 개발 비용이 적게 든다.

 

인터넷표준(HTTP)를 사용함으로써 어떤 다른 기술보다 인터넷 적용성을 지원한다.

 

안정성 및 상호운용성(interoperability) 확보하고 있다.

7.     XML-RPC 환경 구축

l  Apache 사이트에서 XML-RPC 지원 API Xerces API를 다운로드

à http://xml.apache.org/

l  SUN 사이트에서도 XML-RPC API를 다운로드

à http://java.sun.com/xml/jaxrpc/index.html

 

           다운로드한 jar 파일을 Java 2 SDK가 설치된 디렉토리의 jre/lib/ext 디렉토리에 저장

 

8.     XML-RPC의 구현

l  매개변수의 전달

매개변수는 XML-PRC 에서 지정된 타입으로 변환되어야 한다.

기본형은 Wrapper 클래스의 객체로 전달된다.

Byte, Integer, Vector, Hashtable 등의 타입을 지원한다.

매개변수 리스트는 Vector로 넘어간다.

l  반환값

반환값은 항상 Object 타입으로 리턴된다.

반환값은 미리 약속된 타입으로 캐스팅하여 사용한다.

 

예제 소스 :



출처 : e-Campus 강좌 중에서...

2008. 8. 30. 23:57

JDOM의 등장

JDOM의 등장
사용자 삽입 이미지


DOM, SAX 그리고 JDOM API의 관계

사용자 삽입 이미지

JDOM API의 설치

1.     JDOM 다운로드

http://jdom.org

2.     압축 풀기

jdom-b7 이라는 디렉토리가 만들어 진다.

3.     환경 변수 설정

JAVA_HOME

4.     JDOM API 생성

JDOM 압축을 푼 디렉토리에 build.xml build.bat 파일이 DT는 지 확인

build.bat를 수행시켜서 성공적으로 수행되면 “build successful”이라는 메시지가 출려됨.

5.     JDOM API 생성

JDOM 프로그램의 컴파일을 위해 JAVA_HOME디렉토리의 jre/lib/ext 디렉토ㅗ리에 복사한다.

jdom.jar, jaxp.jar, xerces.jar, xalan.jar, crimson.jar




출처 : e-Campus 강좌 중에서
2008. 8. 30. 23:45

SAX 핸들러 구현

1. SAX 핸들러 구현의 간단화

필요한 메서드만을 오버라이딩 하여 구현할 수 있도록 이 인터페이들 모두 상속하여 각 인터페이스에 정의되어 있는 abstract 메서드들을 오버라이딩한 DefaultHandler 클래스를 사용한다.

사용자 삽입 이미지


2. 특정 요소만 추출하여 XML 문서 작성하는 SAX 예제

import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
class SAXSample04 {
     public static void main(String args[]) throws Exception {
          //SAX를 준비한다
          SAXParserFactory spf
                = SAXParserFactory.newInstance();
          SAXParser sp = spf.newSAXParser();
          //핸들러를 준비한다
          SampleHandler04 sh = new SampleHandler04();
          //문서를 읽어들인다
          sp.parse(new FileInputStream("student.xml"), sh);
     }
}
//핸들러 클래스
class SampleHandler04 extends DefaultHandler {
     //문자열을 준비한다
     StringBuffer sb = new StringBuffer();
     boolean isPrint = false;
     //문서의 시작
     public void startDocument() {
          sb.append
          ("<?xml version=\"1.0\" encoding=\"EUC-KR\" ?>");
          sb.append("<초등학생>");
     }
     //문서의 종료
     public void endDocument() {
          sb.append("</초등학생>");
          //문자열을 써넣는다
          try{
               PrintWriter pw = new PrintWriter
                         (new BufferedWriter
                         (new FileWriter("result04.xml")));
                    pw.println(sb);
               pw.close();
          }catch(Exception e){} 
     }
     //요소의 시작
     public void startElement(String namespaceURI, String localName,
                                       String qName, Attributes attrs) {
          if(qName.equals("이름")){
               sb.append("<" + qName + ">");
               isPrint = true;
          }
     }
     //요소의 종료
     public void endElement(String namespaceURI, String localName,
                                       String qName) {
          if(qName.equals("이름")){
               sb.append("</" + qName + ">");
               isPrint = false;
          }
     }
     //문자 데이터
     public void characters(char[] ch, int start,int length) {
          String str = new String(ch, start, length);
          if(str.trim().length() != 0 && isPrint == true){
               sb.append(str);
          }
     }
}

3. 특정 속성만 추출하여 XML 문서 작성하는 SAX 예제

import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
class SAXSample05 {
     public static void main(String args[]) throws Exception {
          //SAX를 준비한다
          SAXParserFactory spf = SAXParserFactory.newInstance();
          SAXParser sp = spf.newSAXParser();
          //핸들러를 준비한다
          SampleHandler05 sh = new SampleHandler05();
          //문서를 읽어들인다
          sp.parse(new FileInputStream("student.xml"), sh);
     }
}
//핸들러 클래스
class SampleHandler05 extends DefaultHandler {
     //문자열을 준비한다
     StringBuffer sb = new StringBuffer();
     //문서의 시작
     public void startDocument() {
          sb.append
          ("<?xml version=\"1.0\" encoding=\"EUC-KR\" ?>");
          sb.append("<초등학생>");
     }
     //문서의 종료
     public void endDocument() {
          sb.append("</초등학생>");
          //문자열을 써넣는다
          try{
               PrintWriter pw = new PrintWriter
                          (new BufferedWriter(new FileWriter("result05.xml")));
               pw.println(sb);
               pw.close();
          }catch(Exception e){} 
     }
     //요소의 시작
     public void startElement(String namespaceURI, String localName,
                                        String qName, Attributes attrs) {
          if(qName.equals("이름")) {
               for(int i=0; i<attrs.getLength(); i++) {
                    sb.append("<" + attrs.getQName(i) + ">");
                    sb.append(attrs.getValue(i));
                    sb.append("</" + attrs.getQName(i) + ">");
               }
          }
     }
}


출처 : e-campus 강좌 중에서
2008. 8. 30. 23:13

XML 문서 편집

1. 새로운 요소 추가

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
public class DOMParser06 {
   public static void main(String args[]) throws Exception {
      //DOM를 준비한다
      DocumentBuilderFactory dbf
         	= DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = dbf.newDocumentBuilder();
      //문서 읽어들이기
      Document xmldoc = parser.parse("student.xml");
      //문서의 출발점을 얻는다
      Element root = xmldoc.getDocumentElement();
      //노드의 자식(child)노드를 찾아간다
      getNode(root);
      //문서 써넣기
      XmlDocument xdoc = (XmlDocument) xmldoc;
      BufferedWriter bw = 
	new BufferedWriter(new FileWriter("student_addelement.xml"));
      xdoc.write(bw,"EUC-KR");
   }

   //노드의 자(child)를 찾아간다
   public static void getNode(Node n) {
      for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()) {
         //요소를 처리한다
         if(ch.getNodeType() == Node.ELEMENT_NODE){
            if(ch.getNodeName().equals("초등학생")){
               Document doc = ch.getOwnerDocument();
               Element comp = doc.createElement("주소");
               Text txt = doc.createTextNode("서울시 송파구");
               ch.appendChild(comp);
               comp.appendChild(txt);
            }
            getNode(ch);
         }
      }
   }
}

2. 원하는 요소의 삭제

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
public class DOMParser07 {
   public static void main(String args[]) throws Exception {
      //DOM를 준비한다
      DocumentBuilderFactory dbf
         = DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = dbf.newDocumentBuilder();
      //문서 읽어들이기
      Document xmldoc = parser.parse("student.xml");
      //문서의 출발점을 얻는다
      Element root = xmldoc.getDocumentElement();
      //노드의 자식(child)노드를 찾아간다
      getNode(root);
      //문서 써넣기
      XmlDocument xdoc = (XmlDocument) xmldoc;
      BufferedWriter bw = 
	new BufferedWriter(new FileWriter("student_delelement.xml"));
      xdoc.write(bw,"EUC-KR");
   }

   //노드의 자(child)를 찾아간다
   public static void getNode(Node n) {
      for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()){
         //요소를 처리한다
         if(ch.getNodeType() == Node.ELEMENT_NODE){
            if(ch.getNodeName().equals("주소")){
               Node pr = ch.getParentNode();
               pr.removeChild(ch);
            }
            getNode(ch);
         }
      }
   }
}

3. 요소에 새로운 텍스트를 추가

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
public class DOMParser08 {
   public static void main(String args[]) throws Exception {
      //DOM를 준비한다
      DocumentBuilderFactory dbf
         = DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = dbf.newDocumentBuilder();
      //문서 읽어들이기
      Document xmldoc = parser.parse(new FileInputStream("student.xml"));
      //문서의 출발점을 얻는다
      Element root = xmldoc.getDocumentElement();
      //노드의 자식(child)노드를 찾아간다
      getNode(root);
      //문서 써넣기
      XmlDocument xdoc = (XmlDocument) xmldoc;
      BufferedWriter bw = 
	new BufferedWriter(new FileWriter("student_addtext.xml"));
      xdoc.write(bw,"EUC-KR");
   }
   public static void getNode(Node n) {
      for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()){
         //요소를 처리한다
         if(ch.getNodeType() == Node.ELEMENT_NODE){
            if(ch.getNodeName().equals("초등학생")){
               Document doc = ch.getOwnerDocument();
               Text txt = doc.createTextNode("초등학생 자료입니다.");
               ch.appendChild(txt);
            }
            getNode(ch);
         }
      }
   }
}

4. 새로운 속성을 추가

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
public class DOMParser09 {
   public static void main(String args[]) throws Exception {
      //DOM를 준비한다
      DocumentBuilderFactory dbf
         = DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = dbf.newDocumentBuilder();
      //문서 읽어들이기
      Document xmldoc = parser.parse("student.xml");
      //문서의 출발점을 얻는다
      Element root = xmldoc.getDocumentElement();
      //노드의 자식(child)노드를 찾아간다
      getNode(root);
      //문서 써넣기
      XmlDocument xdoc = (XmlDocument) xmldoc;
      BufferedWriter bw = 
	new BufferedWriter(new FileWriter("student_addattr.xml"));
      xdoc.write(bw,"EUC-KR");
   }
   //노드의 자(child)를 찾아간다
   public static void getNode(Node n) {
      for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()){
         //요소를 처리한다
         if(ch.getNodeType() == Node.ELEMENT_NODE) {
            if(ch.getNodeName().equals("초등학생")) {
               Element elm =(Element) ch;
               elm.setAttribute("학년", "3");
            }
            getNode(ch);
         }
      }
   }
}

5. 원하는 속성을 삭제

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
public class DOMParser10 {
   public static void main(String args[]) throws Exception {
      //DOM를 준비한다
      DocumentBuilderFactory dbf
         = DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = dbf.newDocumentBuilder();
      //문서 읽어들이기
      Document xmldoc = parser.parse("student.xml");
      //문서의 출발점을 얻는다
      Element root = xmldoc.getDocumentElement();
      //노드의 자식(child)노드를 찾아간다
      getNode(root);
      //문서 써넣기
      XmlDocument xdoc = (XmlDocument) xmldoc;
      BufferedWriter bw = 
	new BufferedWriter(new FileWriter("student_delattr.xml"));
      xdoc.write(bw,"EUC-KR");
   }
   //노드의 자식(child)노드를 찾아간다
   public static void getNode(Node n) {
      for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()) {
         //요소를 처리한다
         if(ch.getNodeType() == Node.ELEMENT_NODE) {
            if(ch.getNodeName().equals("이름")) {
               NamedNodeMap attrmap = ch.getAttributes();
               attrmap.removeNamedItem("성별");
            }
            getNode(ch);
         }
      }
   }
}

6. 원하는 요소들을 추출하여 새로운 XML을 작성

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
public class DOMParser11 {
   public static void main(String args[]) throws Exception {
      //DOM를 준비한다
      DocumentBuilderFactory dbf
         = DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = dbf.newDocumentBuilder();
      //문서 읽어들이기
      Document xmldoc1  = parser.parse(new FileInputStream("student.xml"));
      //문서를 새로 작성한다
      Document xmldoc2 = parser.newDocument();
      //루트 요소를 추가한다
      Element root = xmldoc2.createElement("어린이");
      xmldoc2.appendChild(root);
      //요소를 추출한다
      NodeList lst = xmldoc1.getElementsByTagName("이름");
      for(int i=0; i<lst.getLength(); i++){
         Node n = lst.item(i);
         for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()){
            Element elm = xmldoc2.createElement("이름");
            Text txt = xmldoc2.createTextNode(ch.getNodeValue());
            elm.appendChild(txt);
            root.appendChild(elm);
         }
      }
      //문서 써넣기
      XmlDocument xdoc = (XmlDocument) xmldoc2;
      BufferedWriter bw = new BufferedWriter(new FileWriter("student_new.xml"));
      xdoc.write(bw,"EUC-KR");
   }
}

7. 원하는 속성들을 추출하여 새로운 XML을 작성

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
public class DOMParser12 {
   public static void main(String args[]) throws Exception {
      //DOM를 준비한다
      DocumentBuilderFactory dbf
         = DocumentBuilderFactory.newInstance();
      DocumentBuilder parser  = dbf.newDocumentBuilder();
      //문서 읽어들이기
      Document xmldoc1 = parser.parse(new FileInputStream("student.xml"));
      //문서를 새로 작성한다
      Document xmldoc2 = parser.newDocument();
      //루트 요소를 추가한다
      Element root = xmldoc2.createElement("어린이");
      xmldoc2.appendChild(root);
      //요소를 추출한다
      NodeList lst = xmldoc1.getElementsByTagName("이름");
      for(int i=0; i<lst.getLength(); i++){
         Node n = lst.item(i);
         NamedNodeMap attrlist = n.getAttributes();
         Node attr = attrlist.getNamedItem("성별");
         Element elm = xmldoc2.createElement("성별");
         Text txt = xmldoc2.createTextNode(attr.getNodeValue());
         elm.appendChild(txt);
         root.appendChild(elm);
      }
      //문서 써넣기
      XmlDocument xdoc = (XmlDocument) xmldoc2;
      BufferedWriter bw = 
	new BufferedWriter(new FileWriter("student_newattr.xml"));
      xdoc.write(bw,"EUC-KR");
   }
}

참고 : e-Campus 강좌 중에서...
2008. 8. 30. 22:08

XML 문서 읽기

1. XML 문서에 대한 Document 객체 생성

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInsance();

DocumentBuilder parser = dbf.newDocumentBuilder();

Document xmldoc = parser.parse(“sample.xml”);

Element root = xmldoc.getDocumentElement();

System.out.println(root);


2. 요소명만 추출
공백을 나타내는 텍스트 노드는 제외하고 요소명만 출력하려면 추출된 노드의 타입을 점검하여 Node.ELEMENT_NODE인 경우에만 노드 명을 출력하도록 구현한다.

Element root = doc.getDocumentElement();

for(Node ch = root.getFirstChild(); ch != null; ch = ch.getNextSibling()) {

           if( ch.getNodeType() == Node.ELEMENT_NODE)

                     System.out.println(ch.getNodeName());

}


3. 모든 자식 요소 추출
각각의 자식 노드에 대해서도 getNode() 메서드를 호출하여 자식의 자식 노드들도 추출하도록 구현한다. 재귀함수 기법을 활용한다.

Element root = xmldoc.getDocumentElement();

getNode(root);

 

public static void getNode(Node n) {

           for(Node ch=n.getFirstChild(); ch!=null; ch = ch.getNextSibling()) {

                     if(ch.getNodeType() == Node.ELEMENT_NODE) {

                                System.out.println(ch.getNodeName());

                                getNode(ch);

                     }

                     else if(ch.getNodeType() == Node.TEXT_NODE &&

                                           ch.getNodeValue().trim().length() != 0) {

                                System.out.println(ch.getNodeValue());

                     }

           }

}


4. 노드들의 타입에 따른 파싱
Node 인터페이스에서 지원되는 getNodeType()이라는 메서드를 사용하여 인식된 자식 노드가 어떠한 타입 노드인지에 따라 처리한다.

Type

Parsing

Node.DOCUMENT_NODE

DocumentElement 객체 정보를 가지고 printString()을 호출

Node.ELEMENT_NODE

요소명, 속성 정보(이름, )을 추출하여 xmlString에 저장하고 자손 요소 정보를 가지고 printString()을 호출

Node.CDATA_SECTION_NODE

추출된 값에 <![CDATA [ ]]> 을 추가

Node.TEXT_NODE

값만 추출

Node.PROCESSING_INTRUCTION_NODE

추출된 값에 <? ?> 을 추가


5. 노드들의 타입에 따른 파싱
각 노드 타입에 따라 처리하고 추출된 XML 문서의 내용을 하나의 문자열로 리턴하는 메서드이다.

private String xmlString = “”;

public String printString(Node node) {

           int type = node.getNodeType();

           switch(type0 {

                     case Node.DOCUMENT_NODE:

                                printString(((Document)node).getDocumentElement());

                                break;

                     case Node.ELEMENT_NODE:

                                xmlString += “<” + node.getNodeName();

                                NamedNodeMap attrs = node.getAttributes();

                                for(int i=0; i<attrs.getLength(); i++){

                                          Node attr = attrs.item(i);

                                          xmlString += “ “ + attr.getNodeName() + “=’” + attr.getNodeValue() + “’”;

                                          xmlString += “>”;

                                          NodeList children = node.getChildNodes();

                                          if(children != null) {

                                                     for(int i=0; i<children.getLength(); i++{

                                                                printString(children.item(i));

                                                     }

                                          }

                                          break;

                                }

                     case Node.CDATA_SECTION_NODE:

                                xmlString += “<![CDATA [“ + node.getNodeValue() + “][>”;

                                break;

                     case Node.TEXT_NODE;

                                xmlString += node.getNodeValue().trim();

                                break;

                     case Node.PROCESSING_INSTRUCTION_NODE:

                                xmlString += “<?” + node.getNodeName() + “ “ + node.getNodeValue() + “?>”;

                                break;

           }

           if(type == Node.ELEMENT_NODE){

                     xmlString += “</” + node.getNodeName() + “>”;

           }

           return xmlString;

}




출처 : e-Campus 강좌 중에서...
2008. 8. 30. 14:37

DOM API 계층 구조

사용자 삽입 이미지

Keyword;
DOMImplementation; DOMException; Node; NodeList; NamedNodeMap; DocumentFragment;Document;
DocumentType;Element;Attr;CharacterData;Entity;EntityReference;Notation;ProcessingInstruction;Test;
CDATASection;Comment
2008. 8. 7. 10:18

XML 파서의 종류

파서의 종류

설명

Microsoft XML

Parser*MSXML)

IE5가 출시된 이후, XML 기술의 사용이 좀더 나아졌으며 XML 버전 1.0 스펙을 반영하게 되었다.

James Clark’s XP

James ClarkXPjava로 구현되어 있으며, 외부 DTDWell-formed 문서에 대한 검사를 할 수 있다.

Apache Xerces

오픈 소스 그룹인 Apache의 파서는 C++버전과 Java버전 2가지가 있으며, Java 버전의 경우 Java로 개발되는 대부분의 XML 애플리케이션에서 사용되고 있다.

IBM XML 4c, 4J

IB에서 나오는 C++Java버전의 XML 파서이다.

XML Parser for Java,

for C, for C++

오라클에서 Oracle XML Developer’s Kt이란 이름으로 제공하는 Java, C, C++ 버전의 파서이다.


출처 : www.e-campus.co.kr 교육 과정 중에서