1. Dom (Jaxp Crimson Parser)
DOM은 XML 문서를 플랫폼 및 언어 독립적 방식으로 대표하는 공식 W3C 표준입니다. DOM은 계층 구조로 구성된 노드 또는 정보 조각 모음입니다. 이 계층 구조를 통해 개발자는 트리에서 특정 정보를 찾을 수 있습니다. 이 구조를 분석하려면 일반적으로 작업을 수행하기 전에 전체 문서를로드하고 계층 구조를 구성해야합니다. 정보 수준을 기반으로하기 때문에 DOM은 트리 기반 또는 객체 기반으로 간주됩니다. DOM 및 일반화 된 트리 기반 처리에는 몇 가지 장점이 있습니다. 첫째, 트리는 메모리에서 지속적이므로 응용 프로그램이 데이터 및 구조를 변경할 수 있도록 수정할 수 있습니다. 또한 색소폰과 같은 일회성 작업이 아니라 언제라도 나무를 위아래로 탐색 할 수 있습니다. Dom은 사용하기가 훨씬 간단합니다.
2. 색소폰
SAX 처리의 장점은 스트리밍의 장점과 매우 유사합니다. 모든 데이터가 처리되기를 기다리는 대신 분석은 즉시 시작될 수 있습니다. 또한 응용 프로그램은 데이터를 읽을 때만 데이터 만 확인하므로 데이터를 메모리에 저장할 필요가 없습니다. 이것은 큰 문서에 큰 이점입니다. 실제로 응용 프로그램은 전체 문서를 구문 분석 할 필요조차 없습니다. 특정 조건이 충족되면 구문 분석을 중지 할 수 있습니다. 일반적으로 Sax는 대체 DOM보다 훨씬 빠릅니다.
dom 또는 sax를 선택 하시겠습니까? XML 문서를 처리하기 위해 자체 코드를 작성 해야하는 개발자의 경우 DOM 또는 SAX 구문 분석 모델을 선택하는 것은 매우 중요한 설계 결정입니다. DOM은 트리 구조를 설정하여 XML 문서에 액세스하는 방법을 사용하는 반면 SAX는 이벤트 모델을 사용합니다.
DOM 파서는 XML 문서를 내용물이 포함 된 트리로 변환하여 트리를 가로 질러 갈 수 있습니다. DOM과 모델을 구문 분석하는 이점은 프로그램이 쉽다는 것입니다. 개발자는 트리 제작 지침을 호출 한 다음 내비게이션 API를 사용하여 필요한 트리 노드에 액세스하여 작업을 완료하면됩니다. 트리의 요소를 추가하고 수정하기 쉽습니다. 그러나 DOM 파서를 사용할 때 전체 XML 문서를 처리해야하므로 특히 큰 XML 파일을 만날 때 성능 및 메모리 요구 사항이 비교적 높습니다. 횡단 기능으로 인해 DOM 파서는 종종 XML 문서가 자주 변경 해야하는 서비스에 사용됩니다.
Sax Parser는 이벤트 기반 모델을 채택합니다. XML 문서를 구문 분석 할 때 일련의 이벤트를 트리거 할 수 있습니다. 주어진 태그가 발견되면 콜백 메소드를 활성화하여 태그가 발견되었음을 알 수 있습니다. Sax는 일반적으로 개발자가 처리하려는 태그를 결정할 수 있기 때문에 일반적으로 낮은 메모리가 필요합니다. 특히 개발자가 문서에 포함 된 데이터의 일부만 처리하면 SAX의 확장 능력이 더 잘 반영됩니다. 그러나 SAX 파서를 사용할 때 인코딩이 어렵고 동시에 동일한 문서에서 여러 다른 데이터에 액세스하기가 어렵습니다.
3. JDOM http://www.jdom.org
JDOM의 목적은 XML과의 상호 작용을 단순화하고 DOM을 사용하는 것보다 빠른 Java 별 문서 모델이라는 것입니다. Java 특이 적 모델이기 때문에 Jdom은 활발하게 홍보되고 홍보되었습니다. "Java Specification Request JSR-102"를 통해 "Java Standard Extension"으로 사용하는 것을 고려하십시오. JDOM 개발은 2000 년 초부터 시작되었습니다.
Jdom과 Dom은 주로 두 가지 측면에서 다릅니다. 첫째, JDOM은 인터페이스가 아닌 콘크리트 클래스 만 사용합니다. 이것은 어떤면에서 API를 단순화하지만 유연성도 제한합니다. 둘째, API는 많은 수의 컬렉션 클래스를 사용하여 이미 이러한 클래스에 익숙한 Java 개발자의 사용을 단순화합니다.
JDOM 문서화는 그 목적은 "80% (또는 그 이상) Java/XML 문제를 해결하기위한 20% (또는 그 이하)를 사용하는 것"(학습 곡선에 따라 20%로 가정하는 것입니다. JDOM은 물론 대부분의 Java/XML 애플리케이션에 유용하며 대부분의 개발자는 DOM보다 API가 훨씬 쉽게 이해하기 쉽습니다. JDOM에는 또한 사용자가 XML에서 의미없는 일을하는 것을 방지하기 위해 프로그램 동작에 대한 매우 광범위한 점검이 포함되어 있습니다. 그러나 기본 이외의 일을하기 위해서는 XML을 완전히 이해해야합니다 (또는 경우에 따라 오류를 이해하기도합니다). 이것은 DOM 또는 JDOM 인터페이스를 배우는 것보다 더 의미있는 작업 일 수 있습니다.
JDOM 자체에는 파서가 포함되어 있지 않습니다. 일반적으로 SAX2 파서를 사용하여 입력 XML 문서를 구문 분석하고 검증합니다 (이전에 구성된 DOM 표현을 입력으로 취할 수도 있지만). SAX2 이벤트 스트림, DOM 모델 또는 XML 텍스트 문서에 JDOM 표현을 출력하기위한 일부 변환기가 포함되어 있습니다. JDOM은 Apache 라이센스 변형에 따라 오픈 소스입니다.
4. dom4j http://dom4j.sourceforge.net
DOM4J는 완전히 독립적 인 개발 결과를 나타내지 만 처음에는 JDOM의 지능형 지점이었습니다. 통합 XPATH 지원, XML 스키마 지원 및 대형 또는 스트리밍 문서의 이벤트 기반 처리를 포함하여 기본 XML 문서 표현 이외의 많은 기능을 통합합니다. 또한 DOM4J API 및 표준 DOM 인터페이스를 통한 병렬 액세스가있는 문서 표현을 작성하는 옵션도 제공합니다. 2000 년 하반기부터 개발 중입니다.
이러한 모든 기능을 지원하기 위해 DOM4J는 인터페이스와 추상 기본 클래스 방법을 사용합니다. DOM4J는 API의 컬렉션 클래스를 광범위하게 사용하지만 많은 경우 더 나은 성능 또는보다 간단한 인코딩 방법을 허용하는 몇 가지 대안을 제공합니다. 직접적인 이점은 DOM4J가 더 복잡한 API의 가격을 지불하지만 JDOM보다 훨씬 더 큰 유연성을 제공한다는 것입니다.
유연성, XPATH 통합 및 대규모 문서 처리의 목표를 추가 할 때 DOM4J는 JDOM과 동일합니다 : Java 개발자의 사용 편의성 및 직관적 인 작동. 또한 JDOM보다 더 완전한 솔루션이되어 본질적으로 모든 Java/XML 문제를 다루는 목표를 달성하기 위해 최선을 다하고 있습니다. 이 목표를 달성 할 때 JDOM보다 잘못된 응용 프로그램 동작을 방지하는 데 중점을 둡니다.
DOM4J는 매우 우수한 Java XML API로, 뛰어난 성능, 강력한 기능 및 사용하기 쉽습니다. 또한 오픈 소스 소프트웨어입니다. 요즘에는 점점 더 많은 Java 소프트웨어가 DOM4J를 사용하여 XML을 읽고 쓰고 있음을 알 수 있습니다. Sun의 JAXM조차도 DOM4J를 사용하고 있음을 언급 할 가치가 있습니다.
네 가지 방법의 비교
DOM4J는 최고의 성능을 보유하고 있으며 Sun의 JAXM조차도 DOM4J를 사용합니다. 현재, 많은 오픈 소스 프로젝트는 유명한 최대 절전 모드와 같은 DOM4J를 사용하여 XML 구성 파일을 읽습니다. 이식성이 고려되지 않으면 DOM4J가 사용됩니다.
JDOM과 DOM은 성능 테스트 중에 10m 문서를 테스트 할 때 메모리가 넘쳐나는 동안 성능이 저하됩니다. 작은 문서의 경우 Dom과 Jdom을 고려할 가치가 있습니다. JDOM 개발자들은 공식 릴리스 이전의 성능 관점에서 성능 문제에 초점을 맞출 것으로 예상했지만 실제로는 권장하지 않습니다. 또한 Dom은 여전히 아주 좋은 선택입니다. DOM 구현은 다양한 프로그래밍 언어로 널리 사용됩니다. 또한 공식적으로 W3C 권장 사항 (비표준 기반 Java 모델과 달리)이므로 일부 유형의 프로젝트 (예 : JavaScript에서 DOM을 사용하는 등)에도 필요할 수 있습니다.
Sax는 특정 구문 분석 방법 인 이벤트 중심에 따라 더 잘 수행됩니다. 색소폰은 다가오는 XML 스트림을 감지하지만 메모리에로드되지 않습니다 (물론 XML 스트림을 읽을 때 일부 문서는 메모리에 일시적으로 숨겨집니다).
4 가지 XML 작동 방법의 기본 사용
XML 파일 :
<? xml 버전 = "1.0"alcoding = "gb2312"?> < 결과> < value> < value> < value> < no> a1234 </no> addr> No. XX 섹션 XX Road, XX 타운, XX 카운티, Sichuan 지방 </addr> </value> value> x x xx xx xx xx xx xx xx xx xx 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 (); {file f = 새 파일 ( "data_10k.xml"); DocumentBuilDerfactory factory = documentBuilDerfactory.newinstance (); DocumentBuilder Builder = Factory.NewDocumentBuilder (); 문서 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 (예외 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 arthing = system.currenttimeMillis (); {saxparserfactory sf = saxparserfactory.newinstance (); saxparser sp = sf.newsaxparser (); myxmlreader reader = new myxmlreader (); sp.parse (new inputSource ( "data_10k.xml"), Reader); } catch (예외 e) {e.printstacktrace (); } system.out.println ( "실행 시간 :" + (System.currentTimeMillis () - 지속) + "milliseconds");} public void arcage (char ch [], int start, int length) saxException {string tag = (string) tags.peek (); if (tag.equals ( "no")) {System.out.print ( "번호판 번호 :" + new string (ch, start, longth));} if (tag.equals ( "addr")) {system.out.println ( "주소 :" + new String (ch, start, start)} public void rettelement (String Uri, String Qname, Attributes). 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 arthing = system.currentTimeMillis (); {saxbuilder builder = new SaxBuilder (); docial doc = builder.build (새 파일 ( "data_10k.xml")); 요소 foo = doc.getRootElement (); AllChildren = foo.getchildren (); for (int i = 0; i < allchildren.size (); i ++) {System.out.print ( "번호판 번호 :"+((요소) allchildren.get (i)). getChild ( "no"). getText ()); System.out.println ( "소유자 주소 :" + ((요소) allchildren.get (i)). getchild ( "addr"). getText ()); }} catch (예외 e) {e.printstacktrace ();}} 4) dom4j 구현 방법
import java.io.*; import java.util.*; import org.dom4j.*; import org.dom4j.io. {file f = 새 파일 ( "data_10k.xml"); SaxReader Reader = New SaxReader (); 문서 doc = reader.read (f); 요소 root = doc.getRootElement (); 요소 foo; for (iterator i = root.elementiterator ( "value"); i.hasnext () {foo = (요소) i.next (); System.print ( "번호판 번호 :" + foo.elementText ( "no")); system.out.println ( "소유자의 주소 :" + foo.elementText ( "addr");}}}}}}}}}}}} e.printstacktrace ();})