java에서 네 가지 조작 xml 방식의 비교
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는 일반적으로 메모리에 대한 요구가 비교적 낮을 것이다. 왜냐하면 개발자가 처리할 태그를 스스로 결정하기 때문이다.특히 개발자가 문서에 포함된 일부 데이터만 처리할 수 있을 때 SAX의 이러한 확장 능력은 더욱 잘 나타난다.그러나 SAX 해상도를 사용할 때 인코딩 작업이 어렵고 같은 문서의 여러 데이터를 동시에 접근하기 어렵다.
3)JDOM http://www.jdom.org
JDOM의 목적은 XML과의 상호작용을 간소화하고 DOM을 사용하는 것보다 빠른 Java 특정 문서 모델이 되는 것이다.첫 번째 Java 특정 모델이기 때문에 JDOM은 줄곧 대대적으로 보급되고 추진되었다.Java Specification Request JSR-102를 통해 Java Standard Extension으로 최종 사용하는 것을 고려하고 있습니다.2000년 초부터 JDOM 개발을 시작했습니다.
JDOM과 DOM은 크게 다릅니다.우선 JDOM은 인터페이스를 사용하지 않고 특정 클래스만 사용합니다.이것은 어떤 면에서는 API를 간소화하지만 유연성도 제한한다.둘째, API는 Collections 클래스를 대량으로 사용하여 이미 이런 클래스에 익숙한 자바 개발자들의 사용을 간소화시켰다.
JDOM 문서는 "자바/XML 문제를 80% 이상 해결하는 데 20% 이상의 노력을 기울인다"(학습 곡선에 따라 20%로 가정) 는 목적을 설명합니다.JDOM은 대부분의 Java/XML 응용 프로그램에 당연히 유용하며, 대부분의 개발자들은 API가 DOM보다 훨씬 이해하기 쉽다는 것을 발견한다.JDOM은 또한 사용자가 XML에서 무의미한 일을 하지 않도록 프로그램 행위에 대한 상당히 광범위한 검사를 포함한다.그러나 XML은 기본을 뛰어넘는 작업을 하기 위해 충분히 이해해야 합니다. (심지어 어떤 경우의 오류도 이해해야 합니다.)이것은 아마도 DOM이나 JDOM 인터페이스를 배우는 것보다 더 의미 있는 작업일 것이다.
JDOM 자체에는 해상도가 없습니다.일반적으로 SAX2 해상도를 사용하여 입력 XML 문서를 해석하고 검증합니다(이전에 구성된 DOM을 입력으로 표시할 수도 있지만).여기에는 JDOM 표현을 SAX2 이벤트 흐름, DOM 모델 또는 XML 텍스트 문서로 내보내기 위한 변환기가 포함되어 있습니다.JDOM은 Apache 라이센스 변형 아래에 게시된 오픈 소스 코드입니다.
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과 같습니다. Java 개발자를 위한 용이성과 직관적인 조작입니다.또한 JDOM보다 더 완전한 해결 방안이 되어 본질적으로 모든 Java/XML 문제를 처리하는 목표를 실현하는 데 주력한다.이 목표를 달성할 때 JDOM보다 부정확한 응용 프로그램의 행위를 방지하는 것을 강조합니다.
DOM4J는 매우 우수한 Java XML API로 성능이 우수하고 기능이 강하며 사용하기 쉬운 특징을 가지며 오픈 소스 코드의 소프트웨어이기도 하다.이제 점점 더 많은 자바 소프트웨어들이 DOM4J를 사용하여 XML을 읽고 쓰는 것을 볼 수 있다. 특히 태양의 JAXM마저도 DOM4J를 사용하고 있다.
2...비교
1) DOM4J가 가장 성능이 좋고, Sun의 JAXM도 DOM4J를 사용하고 있습니다.현재 많은 개원 프로젝트에서 DOM4J를 대량으로 사용하고 있는데, 예를 들어 유명한 Hibernate도 DOM4J로 XML 프로필을 읽는다.이식성을 고려하지 않으면 DOM4J를 사용합니다.
2) JDOM 및 DOM은 성능 테스트에서 10M 문서를 테스트할 때 메모리가 넘치도록 좋지 않습니다.작은 문서에서도 DOM과 JDOM을 사용할 필요가 있습니다.JDOM 개발자들은 정식 버전이 나오기 전에 성능 문제에 집중하기를 기대한다고 설명했지만 성능 관점에서 볼 때 추천할 만한 점이 없다.또한 DOM은 여전히 매우 좋은 선택입니다.DOM은 다양한 프로그래밍 언어에 광범위하게 적용됩니다.이것은 여전히 XML과 관련된 많은 다른 표준의 기초이다. 왜냐하면 이것은 정식으로 W3C의 추천을 받기 때문에 (예를 들어 비표준적인 Java 모델을 바탕으로 하는 것과) 일부 유형의 항목에서도 그것을 필요로 할 수 있다. (예를 들어 JavaScript에서 DOM을 사용하는 것)
3) SAX는 특정 해석 방식인 이벤트 구동에 의존하는 것이 좋습니다.SAX가 다가오는 XML 흐름을 감지하지만 메모리에 불러오지 않았습니다. (물론 XML 흐름이 읽히면 일부 문서가 메모리에 잠시 숨겨져 있습니다.)
3. 네 가지 xml 조작 방식의 기본 사용 방법
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();
}
이상은 본문의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있는 동시에 저희를 많이 지지해 주시기 바랍니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.