자바 xml 의 4 가지 방식 의 장단 점 비교 및 상세 한 설명

1.소개 및 장단 점 분석
DOM(Document Object Model)
DOM 은 플랫폼 과 언어 와 무관 한 방식 으로 XML 문 서 를 표시 하 는 공식 W3C 표준 이다.DOM 은 계층 구조 로 구 성 된 노드 나 정보 단편 적 인 집합 이다.이 계층 구 조 는 개발 자 들 이 나무 에서 특정 정 보 를 찾 을 수 있 도록 해 준다.이 구 조 를 분석 하려 면 보통 전체 문서 와 구조 차원 구 조 를 불 러 와 야 모든 일 을 할 수 있다.이것 은 정보 차원 을 바탕 으로 하기 때문에 DOM 은 트 리 나 대상 을 바탕 으로 하 는 것 으로 여 겨 진다.
[장점]
① 응용 프로그램 이 데이터 와 구 조 를 변경 할 수 있 도록 한다.
② 접근 은 양 방향 으로 트 리 에서 상하 로 탐색 하여 임의의 부분의 데 이 터 를 가 져 오고 조작 할 수 있 습 니 다.
전체 문서 트 리 는 메모리 에 있어 서 조작 하기 편리 합 니 다.삭제,수정,재배 열 등 다양한 기능 지원
[단점]
① 보통 전체 XML 문 서 를 불 러 와 차원 구 조 를 구성 하고 자원 을 많이 소모 해 야 한다.
전체 문 서 를 메모리(쓸모없는 노드 포함)로 불 러 와 시간 과 공간 을 낭비 합 니 다.사용 장소:문 서 를 분석 하면 이 데 이 터 를 여러 번 방문 해 야 합 니 다.하드웨어 자원 충분(메모리,CPU)
SAX(Simple API for XML)
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 해상도 기 를 사용 할 때 인 코딩 작업 이 어렵 고 같은 문서 의 여러 데 이 터 를 동시에 접근 하기 어렵다.
[우세]
① 모든 데이터 가 처리 되 기 를 기다 리 지 않 아 도 분석 이 바로 시 작 됩 니 다.
② 데 이 터 를 읽 을 때 만 데 이 터 를 검사 하고 메모리 에 저장 할 필요 가 없습니다.
③ 어떤 조건 이 만족 되 었 을 때 해석 을 중단 할 수 있 으 며 전체 문 서 를 해석 할 필요 가 없다.
④ 효율 과 성능 이 높 고 시스템 메모리 보다 큰 문 서 를 분석 할 수 있 습 니 다.
전체 문 서 를 미리 불 러 오지 않 아 도 자원 이 적 습 니 다.SAX 해상도 기 코드 는 DOM 해상도 기 코드 보다 작 아서 Applet,다운로드 에 적합 합 니 다.
[단점]
① 프로그램 이 TAG 의 처리 논리(예 를 들 어 부모/자식 관계 유지 등)를 스스로 책임 져 야 하고 문서 가 복잡 할 수록 프로그램 이 복잡 해진 다.
② 단 방향 내 비게 이 션 으로 문서 의 차원 을 찾 을 수 없고 같은 문서 의 다른 부분 데 이 터 를 동시에 방문 하기 어렵 고 XPath 가 지원 되 지 않 습 니 다.
오래 지속 되 는 것 이 아니다.사건 이 끝 난 후에 데 이 터 를 저장 하지 않 으 면 데 이 터 를 잃 어 버 립 니 다.무상 태 성;이벤트 에서 텍스트 만 얻 을 수 있 지만 이 텍스트 가 어떤 요소 에 속 하 는 지 모 르 겠 습 니 다.사용 장소:Applet;XML 문서 의 소량의 내용 만 있 으 면 되 돌아 오지 않 습 니 다.기계 의 메모리 가 적다.
JDOM(Java-based Document Object Model)
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 은 아파 치 라이선스 변형 에 의 해 발 표 된 오픈 소스 코드 다.
[장점]
① 인터페이스 가 아 닌 구체 적 인 클래스 를 사용 하여 DOM 의 API 를 간소화 한다.
② 자바 집합 류 를 대량으로 사용 하여 자바 개발 자 를 편리 하 게 한다.
[단점]
① 유연성 이 없다.
② 성능 이 떨어진다.
DOM4J(Document Object Model for Java)
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 를 사용 하고 있다.
[장점]
① 자바 집합 류 를 대량으로 사용 하여 자바 개발 자 들 에 게 편리 함 을 제공 하 는 동시에 성능 을 향상 시 키 는 대체 방법 도 제공한다.
② XPath 지원.
③ 좋 은 성능 을 가지 고 있다.
[단점]
① 인 터 페 이 스 를 대량으로 사용 하여 API 가 복잡 하 다.
요약:
  • XML 문서 가 크 고 이식 성 문 제 를 고려 하지 않 으 면 DOM4J 를 사용 하 는 것 을 권장 합 니 다
  • XML 문서 가 작 으 면 JDOM 을 사용 하 는 것 을 권장 합 니 다
  • 4.567917.데 이 터 를 저장 하지 않 고 신속하게 처리 해 야 한다 면 SAX 를 고려 해 야 한다자신 에 게 맞 는 것 이 가장 좋 습 니 다.시간 이 허락 된다 면 이 네 가지 방법 을 모두 시도 해 보고 자신 에 게 맞 는 것 을 선택 하 는 것 이 좋 습 니 다.
    다음 해석 실현 과정:

    1.먼저 test.xml 파일 을 새로 만 듭 니 다.
    
    <?xml version="1.0" encoding="UTF-8"?>
    <users>
      <user id="0">
        <name>Alexia</name>
        <age>23</age>
        <sex>Female</sex>
      </user>
      <user id="1">
        <name>Edward</name>
        <age>24</age>
        <sex>Male</sex>
      </user>
      <user id="2">
        <name>wjm</name>
        <age>23</age>
        <sex>Female</sex>
      </user>
      <user id="3">
        <name>wh</name>
        <age>24</age>
        <sex>Male</sex>
      </user>
    </users>
    2.xmlDocument.java 만 들 기
    
    public interface XmlDocument {
      
      /**
       *   XML  
       * @param fileName
       *        
       */
      public void parserXml(String fileName);
    }
    3.네 가지 방식 의 실현 을 열거 합 니 다.
    dom4j 의 실현
    
    //dom4j   
    public class Dom4jTest implements XmlDocument {
    
      public void parserXml(String fileName) {
        File inputXml = new File(fileName);
        SAXReader saxReader = new SAXReader();
    
        try {
          Document document = saxReader.read(inputXml);
          Element users = document.getRootElement();
          for (Iterator i = users.elementIterator(); i.hasNext();) {
            Element user = (Element) i.next();
            for (Iterator j = user.elementIterator(); j.hasNext();) {
              Element node = (Element) j.next();
              System.out.println(node.getName() + ":" + node.getText());
            }
            System.out.println();
          }
        } catch (DocumentException e) {
          System.out.println(e.getMessage());
        }
      }
      public static void main(String[] args) {
      	Dom4jTest domj4= new Dom4jTest();
      	//      
      	String path = Dom4jTest.class.getClassLoader().getResource("test.xml").getPath();
      	System.out.println(path);
      	domj4.parserXml(path);
    	}
    dom 의 실현
    
    //dom   
    public class DomTest implements XmlDocument {
      private Document document;
      public void parserXml(String fileName) {
        try {
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          DocumentBuilder db = dbf.newDocumentBuilder();
          Document document = db.parse(fileName);
          NodeList users = document.getChildNodes();
          
          for (int i = 0; i < users.getLength(); i++) {
            Node user = users.item(i);
            NodeList userInfo = user.getChildNodes();
            for (int j = 0; j < userInfo.getLength(); j++) {
              Node node = userInfo.item(j);
              NodeList userMeta = node.getChildNodes();
              
              for (int k = 0; k < userMeta.getLength(); k++) {
                if(userMeta.item(k).getNodeName() != "#text")
                  System.out.println(userMeta.item(k).getNodeName()
                      + ":" + userMeta.item(k).getTextContent());
              }
              
              System.out.println();
            }
          }
          
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (ParserConfigurationException e) {
          e.printStackTrace();
        } catch (SAXException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      
      public static void main(String[] args) {
      	DomTest domj4= new DomTest();
      	//      
      	String path = Dom4jTest.class.getClassLoader().getResource("test.xml").getPath();
      	System.out.println(path);
      	domj4.parserXml(path);
    	}
    }
    }
    sax 의 실현
    
    //sax   
    public class SaxTest implements XmlDocument {
    
      public void parserXml(String fileName) {
        SAXParserFactory saxfac = SAXParserFactory.newInstance();
        try {
          SAXParser saxparser = saxfac.newSAXParser();
          InputStream is = new FileInputStream(fileName);
          saxparser.parse(is, new MySAXHandler());
        } catch (ParserConfigurationException e) {
          e.printStackTrace();
        } catch (SAXException e) {
          e.printStackTrace();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      
      public static void main(String[] args) {
    		SaxTest saxTest = new SaxTest();
    		String path = Dom4jTest.class.getClassLoader().getResource("test.xml").getPath();
    		saxTest.parserXml(path);
    	}
    }
    class MySAXHandler extends DefaultHandler {
      boolean hasAttribute = false;
      Attributes attributes = null;
      public void startDocument() throws SAXException {
        // System.out.println("       ");
      }
    
      public void endDocument() throws SAXException {
        // System.out.println("       ");
      }
    
      public void startElement(String uri, String localName, String qName,
          Attributes attributes) throws SAXException {
        if (qName.equals("users")) {
          return;
        }
        if (qName.equals("user")) {
          return;
        }
        if (attributes.getLength() > 0) {
          this.attributes = attributes;
          this.hasAttribute = true;
        }
      }
    
      public void endElement(String uri, String localName, String qName)
          throws SAXException {
        if (hasAttribute && (attributes != null)) {
          for (int i = 0; i < attributes.getLength(); i++) {
            System.out.print(attributes.getQName(0) + ":" + attributes.getValue(0));
          }
        }
      }
    
      public void characters(char[] ch, int start, int length) throws SAXException {
        System.out.print(new String(ch, start, length));
      }
    }
    jdom 의 실현
    
    //jdom   
    public class JdomTest implements XmlDocument {
    
      public void parserXml(String fileName) {
        SAXBuilder builder = new SAXBuilder();
        try {
          Document document = builder.build(fileName);
          Element users = document.getRootElement();
          List userList = users.getChildren("user");
          for (int i = 0; i < userList.size(); i++) {
            Element user = (Element) userList.get(i);
            List userInfo = user.getChildren();
            for (int j = 0; j < userInfo.size(); j++) {
              System.out.println(((Element) userInfo.get(j)).getName() + ":" + ((Element) userInfo.get(j)).getValue());
            }
            System.out.println();
          }
        } catch (JDOMException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
    
      }
      public static void main(String[] args) {
      	JdomTest jdomTest = new JdomTest();
      	String path = Dom4jTest.class.getClassLoader().getResource("test.xml").getPath();
      	jdomTest.parserXml(path);
      	
    	}
    }
    여기까지 이 네 가지 실현 방식 을 모두 사용 할 수 있다.개인의 견 해 는 dom4j 를 사용 하 는 방식 을 추천 하 는 것 이다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기