JAva解析xmlファイルの4つの方法の紹介、性能比較と基本的な使用方法


一、基本紹介:
1)DOM(JAXP Crimson解析器)DOMは、XMLドキュメントをプラットフォームや言語に関係なく表す公式W 3 C規格です.DOMは、階層で組織されたノードや情報断片の集合です.この階層では、開発者がツリー内で特定の情報を探すことができます.この構造を分析するには、ドキュメント全体をロードし、階層を構築する必要があります.これは、通常、作業を行うためです.情報階層に基づいているため、DOMはツリーまたはオブジェクトに基づいていると考えられる.DOMおよび一般化されたツリーベースの処理にはいくつかの利点がある.まず、ツリーはメモリ内で永続的であるため、アプリケーションがデータと構造を変更できるように変更できます.SAXのように使い捨ての処理ではなく、いつでもツリーの中を上下にナビゲートすることもできます.DOMもずっと簡単に使えます. 
2)SAX SAX処理の利点は、ストリーミングメディアの利点と非常に類似している.分析は、すべてのデータが処理されるのを待つのではなく、すぐに開始することができます.また、アプリケーションは、データの読み取り時にデータをチェックするだけなので、メモリにデータを格納する必要はありません.これは、大規模なドキュメントにとって大きなメリットです.実際、アプリケーションはドキュメント全体を解析する必要もありません.ある条件が満たされたときに解析を停止することができます.一般的に、SAXはその代替者DOMよりもずっと速い.DOMを選びますか、SAXを選びますか.XMLドキュメントを処理するために自分でコードを書く必要がある開発者にとって,DOMかSAX解析モデルかを選択することは非常に重要な設計決定である.DOMは、XMLドキュメントにアクセスするためにツリー構造を構築し、SAXはイベントモデルを採用します. 
DOM解析器はXMLドキュメントをその内容を含むツリーに変換し,ツリーを巡回することができる.DOM解析モデルの利点はプログラミングが容易であり,開発者はツリーを構築する命令を呼び出し,navigation APIsを用いて必要なツリーノードにアクセスしてタスクを完了するだけである.ツリー内の要素を簡単に追加および変更できます.しかし、DOM解析器を使用する場合、XMLドキュメント全体を処理する必要があるため、特に大きなXMLファイルに遭遇した場合、パフォーマンスとメモリに対する要求が高い.その遍歴能力のため、DOM解析器はXMLドキュメントの頻繁な変更を必要とするサービスでよく使用されます.SAX解析器はイベントベースのモデルを採用しており、XMLドキュメントを解析する際に一連のイベントをトリガーすることができ、所与のtagが発見された場合、そのメソッドが作成したラベルが見つかったことを示すコールバックメソッドをアクティブにすることができる.SAXは通常、開発者自身が処理するtagを決定するため、メモリに対する要求が低い.特に、開発者がドキュメントに含まれるデータの一部を処理する必要がある場合、SAXの拡張能力はよりよく体現されています.しかし、SAX解析器を使用する場合、符号化作業は困難であり、同じドキュメント内の複数の異なるデータに同時にアクセスすることは困難である. 
3)JDOMJDOMの目的は,XMLとのインタラクションを簡素化し,DOMを用いるよりも高速に実現するJava特定文書モデルとなることである.最初のJava特定モデルであるため、JDOMは大いに普及し、促進されてきた.「Java仕様要求JSR-102」で最終的に「Java標準拡張」として使用することを検討しています.2000年初頭からすでにJDOM開発が開始されている.JDOMとDOMは主に2つの面で異なる.まず、JDOMはインタフェースを使用せずに特定のクラスのみを使用します.これは、いくつかの態様ではAPIを簡略化するが、柔軟性も制限する.第二に、APIはCollectionsクラスを大量に使用し、これらのクラスに熟知しているJava開発者の使用を簡素化した.JDOMドキュメントは、「Java/XMLの問題を解決するために20%(またはそれ以下)の労力を使用する」ことを目的としています.(学習曲線に基づいて20%と仮定します).JDOMはJava/XMLアプリケーションの多くにとってもちろん有用であり、多くの開発者はAPIがDOMよりも理解しやすいことを発見しています.JDOMには、XMLで無意味なことをしないようにプログラムの動作をかなり広くチェックすることも含まれています.しかし、基本的な作業を超えるためにXMLを十分に理解する必要があります.(または、場合によってはエラーを理解することもできます).これはDOMまたはJDOMインタフェースを学ぶよりも意味のある作業かもしれません.JDOM自体には解析器は含まれていません.入力XMLドキュメントを解析および検証するためにSAX 2解析器を使用するのが一般的です.(以前に構築されたDOM表現を入力としても使用できますが).JDOM表現をSAX 2イベントストリーム、DOMモデル、XML文書ドキュメントに出力する変換器も含まれています.JDOMはApacheライセンスバリエーションの下で公開されたオープンソースです.
4)DOM 4 Jは完全に独立した開発結果を表すが,当初はJDOMの知能分岐であった.統合されたXPathサポート、XML Schemaサポート、および大きなドキュメントまたはストリーミングドキュメントのイベントベースの処理など、基本的なXMLドキュメント表現を超えた多くの機能が統合されています.また、DOM 4 J APIと標準DOMインタフェースを介してパラレルアクセス機能を持つドキュメント表現を構築するオプションも提供されています.2000年下半期から開発中です.これらすべての機能をサポートするために、DOM 4 Jはインタフェースと抽象基本クラスメソッドを使用します.DOM 4 JはAPIのCollectionsクラスを多く使用しているが、多くの場合、より良いパフォーマンスまたはより直接的な符号化方法を可能にするための代替方法も提供されている.直接的な利点は、DOM 4 Jはより複雑なAPIの代価を払ったが、JDOMよりもはるかに大きな柔軟性を提供することである.柔軟性、XPath統合、大文書処理のターゲットを追加する場合、DOM 4 JのターゲットはJDOMと同じです.Java開発者向けの使いやすさと直感的な操作です.また、JDOMよりも完全なソリューションとして、すべてのJava/XML問題を本質的に処理する目標を実現することにも力を入れています.この目標を達成すると、JDOMよりも不正なアプリケーションの動作を防止することを強調することが少なくなります. 
DOM 4 Jは非常に優れたJava XML APIであり、性能に優れ、機能が強く、極端に使いやすいという特徴があり、同時にオープンソースのソフトウェアでもある.今ではますます多くのJavaソフトウェアがDOM 4 Jを使ってXMLを読み書きしているのを見ることができますが、特にSunのJAXMもDOM 4 Jを使っています. 
二、性能比較:
1)DOM 4 Jが最も性能が良く,SunのJAXMもDOM 4 Jを使っている.現在、多くのオープンソースプロジェクトではDOM 4 Jが大量に採用されており、例えば有名なHibernateもDOM 4 JでXMLプロファイルを読み取る.移植性を考慮しなければDOM 4 Jを採用する.2)JDOMとDOMは性能テスト時によくなく、10 Mドキュメントのテスト時にメモリが溢れている.小文書の場合はDOMとJDOMの使用も検討する価値がある.JDOMの開発者は、正式なリリース前にパフォーマンスの問題に専念することを望んでいると説明していますが、パフォーマンスの観点から見ると、推奨すべき点はありません.また、DOMは非常に良い選択です.DOM実装は多様なプログラミング言語に広く応用されている.XMLに関連する他の多くの標準の基礎ですW 3 C推奨(非標準Javaモデルとは対照的)が正式に入手されたため、JavaScriptでDOMを使用するなど、いくつかのタイプのプロジェクトでも必要とされる場合があります.3)SAXは、特定の解析方法であるイベント駆動に依存してパフォーマンスが優れています.SAXは、間もなく到来するXMLストリームを検出しますが、メモリにロードされません.(もちろん、XMLストリームが読み込まれると、一部のドキュメントが一時的にメモリに隠されます).
3、使用例:
xmlファイル
<?xml version="1.0" encoding="GB2312"?> 
<RESULT> 
<VALUE> 
<NO>A1234</NO> 
<ADDR>       XX X XX </ADDR> 
</VALUE> 
<VALUE> 
<NO>B1234</NO> 
   <ADDR>      XX X XX </ADDR> 
</VALUE>
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(); 

} 

)