JAVA 의 XML 에 대한 몇 가지 해석 방식

XML 에 대한 소개 가 비교적 전면적 인 것 은 IBM 의 칼럼 입 니 다.
http://www.ibm.com/developerworks/cn/xml/theme/x-java.html
기본적으로 JAVA 와 XML 의 모든 면 을 포함 하고 있 습 니 다. 
 
1. 소개
    1) DOM (JAXP Crimson 해석 기)
    DOM 은 플랫폼 과 언어 와 무관 한 방식 으로 XML 문 서 를 표시 하 는 공식 W3C 표준 이다.DOM 은 계층 구조 로 구 성 된 노드 나 정보 단편 적 인 집합 이다.이 계층 구 조 는 개발 자 들 이 나무 에서 특정 정 보 를 찾 을 수 있 도록 해 준다.이 구 조 를 분석 하려 면 보통 전체 문서 와 구조 차원 구 조 를 불 러 와 야 모든 일 을 할 수 있다.이것 은 정보 차원 을 바탕 으로 하기 때문에 DOM 은 트 리 나 대상 을 바탕 으로 하 는 것 으로 여 겨 진다.DOM 과 넓 은 의미 의 트 리 기반 처리 가 몇 가지 장점 을 가지 고 있 습 니 다.우선, 트 리 는 메모리 에 오래 지속 되 기 때문에 프로그램 이 데이터 와 구 조 를 변경 할 수 있 도록 수정 할 수 있 습 니 다.SAX 처럼 일회 성 처리 가 아니 라 언제든지 트 리 에서 위아래 로 내 비게 이 션 할 수 있다.DOM 은 사용 하기에 도 훨씬 간단 하 다.
    2)SAX
    SAX 처리 의 장점 은 스 트 리밍 매체 의 장점 과 매우 유사 하 다.분석 은 모든 데이터 가 처리 되 기 를 기다 리 는 것 이 아니 라 바로 시작 할 수 있다.그리고 응용 프로그램 은 데 이 터 를 읽 을 때 만 데 이 터 를 검사 하기 때문에 데 이 터 를 메모리 에 저장 할 필요 가 없다.이것 은 대형 문서 에 있어 서 매우 큰 장점 이다.사실 응용 프로그램 은 전체 문 서 를 해석 할 필요 도 없다.그것 은 어떤 조건 이 만족 되 었 을 때 해석 을 멈 출 수 있다.일반적으로, SAX 는 그것 의 대체 자 DOM 보다 훨씬 빠르다.
    DOM 을 선택 하 시 겠 습 니까? SAX 를 선택 하 시 겠 습 니까?XML 문 서 를 처리 하기 위해 코드 를 작성 해 야 하 는 개발 자 에 게 DOM 인지 SAX 해석 모델 을 선택 하 는 것 은 매우 중요 한 디자인 결정 이다.DOM 은 트 리 구 조 를 만 드 는 방식 으로 XML 문 서 를 방문 하고 SAX 는 이벤트 모델 을 사용 합 니 다.
    DOM 해상도 기 는 XML 문 서 를 그 내용 을 포함 하 는 트 리 로 바 꾸 고 트 리 를 옮 겨 다 닐 수 있 습 니 다.DOM 으로 모델 을 분석 하 는 장점 은 프로 그래 밍 이 쉽다 는 것 이다. 개발 자 는 트 리 를 만 드 는 명령 만 호출 한 다음 에 navigation API 를 이용 하여 필요 한 트 리 노드 를 방문 하여 임 무 를 완성 해 야 한다.트 리 의 요 소 를 쉽게 추가 하고 수정 할 수 있 습 니 다.그러나 DOM 해상도 기 를 사용 할 때 전체 XML 문 서 를 처리 해 야 하기 때문에 성능 과 메모리 에 대한 요구 가 비교적 높다. 특히 매우 큰 XML 파일 을 만 났 을 때.옮 겨 다 니 는 능력 때문에 DOM 해상도 기 는 XML 문서 가 자주 바 뀌 어야 하 는 서비스 에 자주 사 용 됩 니 다.
    SAX 해상도 기 는 이벤트 기반 모델 을 사용 합 니 다. XML 문 서 를 분석 할 때 일련의 이 벤트 를 촉발 할 수 있 습 니 다. 주어진 tag 를 발 견 했 을 때 리 셋 방법 을 활성화 하여 이 방법 으로 만 든 탭 을 찾 았 음 을 알려 줍 니 다.SAX 는 메모리 에 대한 요구 가 비교적 낮 습 니 다. 개발 자 스스로 처리 할 tag 를 결정 하도록 하기 때 문 입 니 다. 특히 개발 자가 문서 에 포 함 된 일부 데이터 만 처리 해 야 할 때 SAX 의 이러한 확장 능력 은 더욱 잘 나타 납 니 다.그러나 SAX 해상도 기 를 사용 할 때 인 코딩 작업 이 어렵 고 같은 문서 의 여러 데 이 터 를 동시에 접근 하기 어렵다.
    3)JDOM http://www.jdom.org
    JDOM 의 목적 은 자바 의 특정 문서 모델 이 되 는 것 이다. XML 과 의 상호작용 을 간소화 하고 DOM 을 사용 하 는 것 보다 빠르다.첫 번 째 자바 특정 모델 이기 때문에 JDOM 은 큰 홍보 와 추진 을 받 아 왔 다.'자바 규범 요청 JSR - 102' 를 통 해 최종 적 으로 '자바 표준 확장' 으로 사용 하 는 것 을 고려 하고 있 습 니 다.2000 년 초부 터 JDOM 개발 이 시 작 됐 습 니 다.
    JDOM 과 DOM 은 주로 두 가지 측면 이 다르다.우선 JDOM 은 인 터 페 이 스 를 사용 하지 않 고 구체 적 인 클래스 만 사용한다.이 는 어떤 면 에 서 는 API 를 간소화 하지만 유연성 도 제한 했다.둘째, API 는 Collections 류 를 대량으로 사용 하여 이러한 종류의 자바 개발 자 들 의 사용 을 간소화 했다.
    JDOM 문 서 는 "20% (또는 더 적은) 의 정력 으로 80% (또는 더 많은) 자바 / XML 문 제 를 해결 하 는 것" (학습 곡선 에 따라 20% 로 가정) 이 목적 이 라 고 밝 혔 다.JDOM 은 대부분의 자바 / XML 응용 프로그램 에 당연히 유용 하 며, 대부분의 개발 자 들 은 API 가 DOM 보다 훨씬 쉽게 이해 할 수 있다 는 것 을 발견 했다.JDOM 은 사용자 가 XML 에서 의미 없 는 일 을 하지 않도록 프로그램 행위 에 대한 광범 위 한 검 사 를 포함한다.그러나 기본 을 초과 하 는 작업 을 하거나 어떤 상황 에서 의 오 류 를 이해 할 수 있 도록 XML 을 충분히 이해 해 야 합 니 다.DOM 이나 JDOM 인 터 페 이 스 를 배 우 는 것 보다 더 의미 있 는 작업 일 수도 있다.
    JDOM 자체 에는 해상도 가 포함 되 어 있 지 않 습 니 다.이것 은 보통 SAX2 해상도 기 를 사용 하여 입력 XML 문 서 를 분석 하고 검증 합 니 다. (비록 이전 구조의 DOM 을 입력 으로 표시 할 수 있 지만)JDOM 을 SAX2 이벤트 흐름, DOM 모델 또는 XML 텍스트 문서 로 출력 하 는 변환 기 를 포함 합 니 다.JDOM 은 아파 치 라이선스 변형 에 의 해 발 표 된 오픈 소스 코드 다.
    4)DOM4J http://dom4j.sourceforge.net
    DOM4J 는 완전히 독립 된 개발 결 과 를 대 표 했 지만 처음에는 JDOM 의 스마트 한 지점 이 었 다.이 는 통합 적 인 XPath 지원, XML Schema 지원, 큰 문서 나 스 트림 문서 에 사용 되 는 이벤트 기반 처 리 를 포함 하여 기본 XML 문서 이상 의 기능 을 합 쳤 다.DOM4J API 와 표준 DOM 인 터 페 이 스 를 통 해 병렬 접근 기능 을 가 진 구축 문서 표시 옵션 도 제공 합 니 다.2000 하반기 부터 개발 중이 다.
    이러한 모든 기능 을 지원 하기 위해 DOM4J 는 인터페이스 와 추상 적 인 기본 클래스 방법 을 사용한다.DOM4J 는 API 의 Collections 류 를 대량으로 사 용 했 지만 많은 경우 에 더 좋 은 성능 이나 직접적인 인 코딩 방법 을 허용 하 는 대체 방법 을 제공 합 니 다.직접적인 장점 은 DOM4J 가 더 복잡 한 API 의 대 가 를 치 렀 지만 JDOM 보다 훨씬 큰 유연성 을 제공 했다 는 점 이다.
    유연성, XPath 통합 과 큰 문서 처리 목 표를 추가 할 때 DOM4J 의 목 표 는 JDOM 과 같 습 니 다. 자바 개발 자 에 대한 용이 성과 직관 적 인 조작 입 니 다.JDOM 보다 더 완전한 솔 루 션 이 되 어 모든 자바 / XML 문 제 를 본질 적 으로 다 루 겠 다 는 목 표를 달성 하 는 데 도 주력 하고 있다.이 목 표를 달성 할 때 는 JDOM 보다 부정 확 한 프로그램 행 위 를 방지 하 는 것 을 강조 하지 않 는 다.
    DOM4J 는 매우 우수한 자바 XML API 로 성능 이 우수 하고 기능 이 강하 며 사용 하기 쉬 운 특징 을 가지 고 있 으 며 소스 코드 를 개방 하 는 소프트웨어 이기 도 하 다.이제 점점 더 많은 자바 소프트웨어 가 DOM4J 를 사용 하여 XML 을 읽 고 쓰 는 것 을 볼 수 있다. 특히 Sun 의 JAXM 도 DOM4J 를 사용 하고 있다.
2. 비교
    1) DOM4J 의 성능 이 가장 좋 고 Sun 의 JAXM 도 DOM4J 를 사용 하고 있 습 니 다. 현재 많은 오픈 소스 프로젝트 에서 DOM4J 를 대량으로 사용 하고 있 습 니 다. 예 를 들 어 유명한 Hibernate 도 DOM4J 로 XML 설정 파일 을 읽 습 니 다.이식 성 을 고려 하지 않 으 면 DOM4J 를 사용한다.
    2) JDOM 과 DOM 은 성능 테스트 에서 좋 지 않 았 고 10M 문 서 를 테스트 할 때 메모리 가 넘 쳤 다.작은 문서 의 경우 DOM 과 JDOM 을 사용 하 는 것 도 고려 해 야 한다. JDOM 개발 자 들 은 정식 발행 전에 성능 문제 에 전념 하 기 를 원한 다 고 설 명 했 지만 성능 관점 에서 볼 때 추천 할 만 한 점 이 없다.또 DOM 은 좋 은 선택 이다.DOM 은 다양한 프로 그래 밍 언어 에 광범 위 하 게 응용 된다.이것 은 XML 과 관련 된 다른 표준 의 기초 이기 도 합 니 다. W3C 추천 (비 표준 적 인 자바 모델 과 상대 적 으로) 을 정식으로 받 았 기 때문에 특정한 유형의 프로젝트 에서 도 필요 할 수 있 습 니 다 (예 를 들 어 자바 스 크 립 트 에서 DOM 을 사용 합 니 다).
    3) SAX 의 표현 이 좋 습 니 다. 이것 은 특정한 해석 방식 인 이벤트 구동 에 의존 해 야 합 니 다.다가 오 는 XML 흐름 을 SAX 에서 감지 하지만 메모리 에 불 러 오지 않 았 습 니 다. (물론 XML 흐름 이 읽 힐 때 일부 문 서 는 메모리 에 잠시 숨 어 있 습 니 다.)
 
 3. 네 가지 XML 조작 방식 의 기본 적 인 사용 방법
<?xml version="1.0" encoding="GB2312"?>

    <RESULT>

    <VALUE>

    <NO>A1234</NO>

    <ADDR>   XX XX XX X XX </ADDR>

    </VALUE>

    <VALUE>

    <NO>B1234</NO>

    <ADDR>   XX XX XX XX </ADDR>

    </VALUE>

    </RESULT>

 1)DOM
    import java.io.*;

    import java.util.*;

    import org.w3c.dom.*;

    import javax.xml.parsers.*;

    public class MyXMLReader{

    public static void main(String arge[]){

    long lasting =System.currentTimeMillis();
try{

    File f=new File("data_10k.xml");

    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

    DocumentBuilder builder=factory.newDocumentBuilder();

    Document doc = builder.parse(f);

    NodeList nl = doc.getElementsByTagName("VALUE");

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

    System.out.print("    :" +

    doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());

    System.out.println("    :" +

    doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());

    }

    }catch(Exception e){

    e.printStackTrace();

    }

  2)SAX
import org.xml.sax.*;

    import org.xml.sax.helpers.*;

    import javax.xml.parsers.*;

    public class MyXMLReader extends DefaultHandler {

    java.util.Stack tags = new java.util.Stack();

    public MyXMLReader() {

    super();

    }

    public static void main(String args[]) {

    long lasting = System.currentTimeMillis();

    try {
 SAXParserFactory sf = SAXParserFactory.newInstance();

    SAXParser sp = sf.newSAXParser();

    MyXMLReader reader = new MyXMLReader();

    sp.parse(new InputSource("data_10k.xml"), reader);

    } catch (Exception e) {

    e.printStackTrace();

    }

    System.out.println("    :" + (System.currentTimeMillis() - lasting) + "  ");}

    public void characters(char ch[], int start, int length) throws SAXException {

    String tag = (String) tags.peek();

    if (tag.equals("NO")) {

    System.out.print("    :" + new String(ch, start, length));

    }

    if (tag.equals("ADDR")) {

    System.out.println("  :" + new String(ch, start, length));

    }

    }

    public void startElement(String uri,String localName,String qName,Attributes attrs) {

    tags.push(qName);}

    }

 
 3)JDOM 
import java.io.*;

    import java.util.*;

    import org.jdom.*;

    import org.jdom.input.*;

    public class MyXMLReader {

    public static void main(String arge[]) {

    long lasting = System.currentTimeMillis();

    try {

    SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data_10k.xml"));

    Element foo = doc.getRootElement();

    List allChildren = foo.getChildren();

    for(int i=0;i<allChildren.size();i++) {

    System.out.print("    :" +

    ((Element)allChildren.get(i)).getChild("NO").getText());

    System.out.println("    :" +

    ((Element)allChildren.get(i)).getChild("ADDR").getText());

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

 4)DOM4J
import java.io.*;

    import java.util.*;

    import org.dom4j.*;

    import org.dom4j.io.*;

    public class MyXMLReader {

    public static void main(String arge[]) {

    long lasting = System.currentTimeMillis();

    try {

    File f = new File("data_10k.xml");

    SAXReader reader = new SAXReader();

    Document doc = reader.read(f);

    Element root = doc.getRootElement();

    Element foo;

    for (Iterator i = root.elementIterator("VALUE"); i.hasNext() {

    foo = (Element) i.next();

    System.out.print("    :" + foo.elementText("NO"));

    System.out.println("    :" + foo.elementText("ADDR"));

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    )

 
 

좋은 웹페이지 즐겨찾기