우리 모두 알다시피, 현재 XML을 구문 분석하는 방법이 점점 더 많지만 4 가지 주류 방법, 즉 Dom, Sax, JDOM 및 DOM4J가 있습니다.
다음은이 네 가지 방법에 대한 JAR 패키지 다운로드 주소를 가장 먼저 제공하는 것입니다.
DOM : XML-APIS.JAR 패키지의 현재 Java JDK로 제공됩니다.
색소폰 : http://sourceforge.net/projects/sax/
jdom : http://jdom.org/downloads/index.html
dom4j : http://sourceforge.net/projects/dom4j/
1. 장점과 단점의 소개 및 분석
1. dom (문서 개체 모델)
DOM은 XML 문서를 플랫폼 및 언어 독립적 방식으로 대표하는 공식 W3C 표준입니다. DOM은 계층 구조로 구성된 노드 또는 정보 조각 모음입니다. 이 계층 구조를 통해 개발자는 트리에서 특정 정보를 찾을 수 있습니다. 이 구조를 분석하려면 일반적으로 작업을 수행하기 전에 전체 문서를로드하고 계층 구조를 구성해야합니다. 정보 수준을 기반으로하기 때문에 DOM은 트리 기반 또는 객체 기반으로 간주됩니다.
【이점】
placts 응용 프로그램이 데이터 및 구조를 변경할 수 있도록합니다.
Access 액세스는 양방향이며 언제든지 트리를 위아래로 탐색하고 데이터의 일부를 얻고 작동 할 수 있습니다.
【결점】
① 일반적으로, 전체 XML 문서는 계층 구조를 구성하기 위해로드되어야하며, 이는 많은 리소스를 소비합니다.
2. 색소폰 (XML 용 간단한 API)
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 파서를 사용할 때 인코딩이 어렵고 동시에 동일한 문서에서 여러 다른 데이터에 액세스하기가 어렵습니다.
【장점 ages
모든 데이터가 처리 될 때까지 기다릴 필요가 없으며 분석이 즉시 시작될 수 있습니다.
data 데이터를 읽을 때만 데이터를 확인하고 메모리에 저장할 필요가 없습니다.
③ 전체 문서를 구문 분석하지 않고도 특정 조건이 충족되면 구문 분석을 중지 할 수 있습니다.
④ 고효율 및 성능 및 시스템 메모리보다 더 큰 문서를 구문 분석 할 수 있습니다.
【결점】
Application 응용 프로그램은 TAG의 처리 논리 (예 : 부모/자식 관계 유지 등)를 담당해야합니다. 문서가 복잡할수록 프로그램이 더 복잡해집니다.
일방형 내비게이션은 문서 계층을 찾을 수 없으며 동시에 동일한 문서 데이터의 다른 부분에 액세스하기가 어렵고 XPath를 지원하지 않습니다.
3. JDOM (Java 기반 문서 객체 모델)
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 라이센스 변형에 따라 오픈 소스입니다.
【이점】
dom Dom API를 단순화하여 인터페이스 대신 콘크리트 클래스를 사용합니다.
② 많은 Java 컬렉션 클래스가 Java 개발자를 용이하게하는 데 사용됩니다.
【결점】
좋은 유연성이 없습니다.
성능 저하.
4. dom4j (Java의 문서 개체 모델)
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를 사용하고 있음을 언급 할 가치가 있습니다.
【이점】
Java Java Collection 클래스는 Java 개발자를 용이하게하고 성능을 향상시키는 몇 가지 대안 방법을 제공하는 데 널리 사용됩니다.
② XPATH를 지원합니다.
performance 좋은 성능이 있습니다.
【결점】
incface 인터페이스는 광범위하게 사용되며 API는 비교적 복잡합니다.
2. 비교
1. DOM4J는 최고의 성능을 가지고 있으며 Sun의 JAXM조차도 DOM4J를 사용합니다. 현재, 많은 오픈 소스 프로젝트는 유명한 최대 절전 모드와 같은 DOM4J를 사용하여 XML 구성 파일을 읽습니다. 이식성이 고려되지 않으면 DOM4J가 사용됩니다.
2. JDOM과 DOM은 성능 테스트 중에 10m 문서를 테스트 할 때 메모리가 오버플로 나오지만 휴대용이 잘못되었습니다. 작은 문서의 경우 Dom과 Jdom을 고려할 가치가 있습니다. JDOM 개발자들은 공식 릴리스 이전의 성능 관점에서 성능 문제에 초점을 맞출 것으로 예상했지만 실제로는 권장하지 않습니다. 또한 Dom은 여전히 아주 좋은 선택입니다. DOM 구현은 다양한 프로그래밍 언어로 널리 사용됩니다. 또한 공식적으로 W3C 권장 사항 (비표준 기반 Java 모델과 달리)이므로 일부 유형의 프로젝트 (예 : JavaScript에서 DOM을 사용하는 등)에도 필요할 수 있습니다.
3. SAX는 특정 분석 방법 - 이벤트 중심에 따라 더 잘 수행됩니다. 색소폰은 다가오는 XML 스트림을 감지하지만 메모리에로드되지 않습니다 (물론 XML 스트림을 읽을 때 일부 문서는 메모리에 일시적으로 숨겨집니다).
내 의견 : XML 문서가 크고 이식성 문제를 고려하지 않으면 DOM4J를 사용하는 것이 좋습니다. XML 문서가 작 으면 JDOM을 사용하는 것이 좋습니다. 데이터를 저장하지 않고 제 시간에 처리 해야하는 경우 SAX를 고려하는 것이 좋습니다. 그러나 무엇이든 상관없이, 같은 문장은 다음과 같습니다. 가장 좋은 것은 옳은 것입니다. 시간이 허용되면이 네 가지 방법을 시도하고 자신에게 적합한 방법을 선택하는 것이 좋습니다.
III. 예
공간을 절약하기 위해 XML 문서 작성 의이 네 가지 방법과 차이점은 당분간 여기에 제공되지 않습니다. XML 문서를 구문 분석하기위한 코드 만 제공됩니다. 완전한 프로젝트가 필요한 경우 (XML 문서 구축 + 구문 분석 XML + 테스트 비교).
구문 분석의 예로 다음 XML 컨텐츠는 다음과 같습니다.
<? xml version = "1.0"alcoding = "utf-8"?> <user> <user> <user id = "0"> <name> alexia </name> <ege> 23 </age> <섹스> </sex> </user> <user id = "1"> <name> edward </name> <ge> 24 </age> male </user> <user id = "2."> w. <Age> 23 </age> <sex> 여성 </sex> </user> <User ID = "3"> <name> wh </name> <ge> 24 </age> <sex> male </sex> </user> </users>
먼저 XML 문서 구문 분석의 인터페이스를 정의합니다.
/*** @Author Alexia** XML 문서 구문 분석의 인터페이스 정의*/public interface xmldocument {/*** 구문 분석 XML 문서** @param filename* 파일 전체 경로 이름*/public void parserxml (String filename);} 1. Dom 예제
package com.xml; import java.io.filenotfoundException; import java.io.fileoutputStream; import java.io.ioexception; import java.io.printwriter; import javax.xml.parsers.documentBuilder; import javax.xml.parsers.documentbuiltortory; javax.xml.parsers.parserconfigurationException; import javax.xml.transform.outputkeys; import javax.xml.transform.transformer; import javax.xml.transform.transformerconfigurationException; import javax.xml.transform.transform.transform.transformecment; javax.xml.transform.transformerfactory; import javax.xml.transform.dom.domsource; import javax.xml.transform.stream.streamresult; import org.w3c.dom.document; import org.w3c.dom.dom.lement; import org.w3c.dom.node; org.w3c org.xml.sax.saxexception;/** * @author alexia * * dom parsing xml 문서 */public class domdemo 구현 xmldocument {개인 문서 문서; public void parserxml (String filename) {try {documentbuilderfactory dbf = documentBuilDerfactory.newinstance (); DocumentBuilder db = dbf.newDocumentBuilder (); 문서 문서 = db.parse (filename); nodelist users = document.getchildnodes (); for (int i = 0; i <user.getLength (); i ++) {node user = user.Item (i); nodelist userInfo = user.getChildNodes (); for (int j = 0; 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)); } system.out.println (); }}} catch (filenotfoundException e) {e.printstacktrace (); } catch (parserconFigurationException e) {e.printstacktrace (); } catch (saxexception e) {e.printstacktrace (); } catch (saxexception e) {e.printstacktrace (); } catch (saxexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }}} 2. 색소폰 예
패키지 com.xml; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.fileoutputStream; import java.io.ioException; import java.io.inputStream; import java.io.outputStream; import java.io.stringwriter; import; javax.xml.parsers.parserconfigurationException; import javax.xml.parsers.saxparser; import javax.xml.xml.xparserfactory; import javax.xml.transform.outputkeys; import javax.xml.transform.result; import javax.xml.xml.xml.xml.xml.xml.xml.xml.xml.xml.xml.xml javax.xml.transform.transformerconfigurationException; import javax.xml.sax.saxtransformerfactory; import javax.xml.transform.sax.transformerhandler; import javax.xml.transform.stream.streamresult; import org.xml.sax org.xml.sax.saxexception; import org.xml.sax.helpers.attributesimpl; import org.xml.sax.helpers.defaulthandler;/** * @author alexia * * sax parsing xml 문서 */public class saxdemo elements xmldocumument (public void parxml) saxparserfactory saxfac = saxparserfactory.newinstance (); {saxparser saxparser = saxfac.newsaxparser (); inputStream은 = 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 (); }}} class mysaxhandler는 defaulthandler {boolean hasattribute = false; 속성 속성 = null; public void startDocument ()는 saxException {// system.out.println ( "문서가 인쇄를 시작했습니다"); } public void endDocument ()는 saxException {// system.out.println ( "문서가 인쇄를 종료했습니다"); } public void startElement (String URI, String localName, String Qname, Attributes 속성) saxException {if (qname.equals ( "users")) {return; } if (qname.equals ( "user")) {return; } if (attributes.getLength ()> 0) {this.attributes = attributes; hasattribute = true; }} public void endlement (String uri, String localName, String Qname)는 saxException {if (hasattribute && (astributes! = null))) {for (int i = 0; i <attributes.getLength (); i ++) {system.out.print (attributes.getQname (0)); }}} public void 문자 (char [] ch, int start, int length) saxexception {system.out.print (new String (ch, start, length)); }} 3. JDOM 예
패키지 com.xml; import java.io.filenotfoundException; import java.io.fileoutputStream; import java.io.ioexception; import java.util.list; import org.jdom2.document; import org.jdom2. Element; import org.jdom2.jdomexception; import org.jdom2.input.saxbuilder; org.jdom2.output.xmloutputter;/** * @Author Alexia * * Jdom Parsing XML 문서 * */public class jdomdemo 구현 xmlDocument {public void parserxml (String filename) {saxbuilder = new SaxBuilder (); try {document document = builder.build (filename); 요소 사용자 = document.getRootElement (); List userList = user.GetChildren ( "사용자"); for (int i = 0; i <userList.size (); i ++) {element user = (element) userList.get (i); List userInfo = user.getChildren (); for (int j = 0; } system.out.println (); }} catch (jdomexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }}} 4. dom4j 예
package com.xml; import java.io.file; import java.io.filewriter; import java.io.ioexception; import java.io.writer; import java.util.iterator; import org.dom4j.document; import org.dom4j.documentexception; import org.dom4j.documenthelper; org.dom4j.io.saxreader; import org.dom4j.io.xmlwriter;/** * @author alexia * * dom4j parse xml 문서 */public class dom4jdemo 구현 xmldocument {public void parserxml (string filename) {file inputxml = new Pile); SaxReader SaxReader = New SaxReader (); {document document = saxReader.Read (inputxml); 요소 사용자 = document.getRootElement (); for (iterator i = user.elementiterator (); i.hasnext ();) {element user = (element) i.next (); for (iterator j = user.elementiterator (); System.out.println (node.getName () + ":" + node.getText ()); } system.out.println (); }} catch (DocumentException e) {System.out.println (e.getMessage ()); }}}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.