1。Dom(Jaxp Crimsonパーサー)
DOMは、プラットフォームおよび言語に依存しない方法でXMLドキュメントを表現するための公式のW3C標準です。 DOMは、階層で編成されたノードまたは情報フラグメントのコレクションです。この階層により、開発者はツリー内の特定の情報を探すことができます。この構造を分析するには、通常、作業を行う前にドキュメント全体を読み込み、階層を構築する必要があります。情報レベルに基づいているため、DOMはツリーベースまたはオブジェクトベースであると見なされます。 DOMおよび一般化されたツリーベースの処理には、いくつかの利点があります。第一に、ツリーはメモリに永続的であるため、アプリケーションがデータと構造を変更できるように変更できます。また、SAXのような1回限りの仕事ではなく、いつでもツリーを上下に移動することができます。 DOMの使用ははるかに簡単です。
2。サックス
SAX処理の利点は、ストリーミングの利点に非常に似ています。分析は、すべてのデータが処理されるのを待つのではなく、すぐに開始できます。また、アプリケーションは読み取り時にデータをチェックするため、データをメモリに保存する必要はありません。これは、大規模な文書にとって大きな利点です。実際、アプリケーションはドキュメント全体を解析する必要さえありません。特定の条件が満たされたときに解析を停止できます。一般的に言えば、SAXはその置換DOMよりもはるかに高速です。
domまたはsaxを選択しますか? XMLドキュメントを処理するために独自のコードを作成する必要がある開発者にとって、DOMまたはSAXの解析モデルを選択することは非常に重要な設計上の決定です。 DOMは、ツリー構造を確立してXMLドキュメントにアクセスする方法を使用し、SAXはイベントモデルを使用します。
Dom Parserは、XMLドキュメントをその内容を含むツリーに変換し、ツリーを通過できます。モデルをDOMで解析する利点は、プログラムが簡単であることです。開発者は、ツリーメイキングの指示を呼び出してから、ナビゲーションAPIを使用して必要なツリーノードにアクセスしてタスクを完了する必要があります。ツリー内の要素を追加および変更するのは簡単です。ただし、Dom Parserを使用する場合はXMLドキュメント全体を処理する必要があるため、特に大規模なXMLファイルに遭遇する場合は、パフォーマンスとメモリの要件が比較的高くなっています。トラバーサル機能により、XMLドキュメントが頻繁に変更する必要があるサービスでDOMパーサーが使用されることがよくあります。
SAXパーサーは、イベントベースのモデルを採用しています。 XMLドキュメントを解析するときに、一連のイベントをトリガーできます。特定のタグが見つかった場合、コールバックメソッドをアクティブにして、タグが見つかったことをメソッドに伝えることができます。 SAXは通常、開発者が処理するタグを決定できるため、低メモリが必要です。特に、開発者がドキュメントに含まれるデータの一部のみを処理する必要がある場合、Saxの拡張能力はよりよく反映されます。ただし、SAXパーサーを使用する場合、エンコーディングは困難であり、同じドキュメントで複数の異なるデータに同時にアクセスすることは困難です。
3。JDOMhttp ://www.jdom.org
JDOMの目的は、XMLとの相互作用を簡素化し、DOMを使用するよりも速いJava固有のドキュメントモデルであることです。これは最初のJava固有のモデルであるため、JDOMは激しく促進され、促進されています。 「Java仕様リクエストJSR-102」を介して「Java Standard Extension」として使用することを検討してください。 JDOM開発は2000年の初めから開始されています。
JDOMとDOMは、主に2つの側面で異なります。まず、JDOMはコンクリートクラスのみを使用し、インターフェイスではありません。これにより、APIがいくつかの点で簡素化されますが、柔軟性も制限されます。第二に、APIは多数のコレクションクラスを使用しており、すでにこれらのクラスに精通しているJava開発者の使用を簡素化します。
JDOMドキュメントでは、その目的は、「80%(またはそれ以上)Java/XMLの問題を解決するために20%(またはそれ以下)を使用する」ことであると述べています(学習曲線に基づいて20%と想定)。 JDOMはもちろん、ほとんどのJava/XMLアプリケーションに役立ち、ほとんどの開発者はAPIがDOMよりもはるかに理解しやすいと感じています。 JDOMには、ユーザーがXMLで無意味なことをしないようにするためのプログラム動作に関する非常に広範なチェックも含まれています。ただし、基本を超えて何かを行うためにXMLを完全に理解する必要があります(または、場合によってはエラーを理解することさえあります)。これは、DOMまたはJDOMインターフェイスを学習するよりも意味のある仕事かもしれません。
JDOM自体にはパーサーが含まれていません。通常、SAX2パーサーを使用して入力XMLドキュメントを解析および検証します(ただし、以前に構築されたDOM表現を入力として使用することもできます)。 SAX2イベントストリーム、DOMモデル、またはXMLテキストドキュメントにJDOM表現を出力するためのいくつかのコンバーターが含まれています。 JDOMは、Apacheライセンスバリアントの下でリリースされたオープンソースです。
4。Dom4jhttp ://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を使用していることに特に言及する価値があります。
4つの方法の比較
Dom4Jは最高のパフォーマンスを持っており、SunのJaxmでさえDom4Jを使用します。現在、多くのオープンソースプロジェクトでは、有名なHibernateがDOM4Jを使用してXML構成ファイルを読み取るなど、大量にDOM4Jを使用しています。移植性が考慮されない場合、DOM4Jが使用されます。
JDOMとDOMは、パフォーマンステスト中にパフォーマンスが低下し、10mのドキュメントをテストするときにメモリがオーバーフローします。また、小さなドキュメントの場合はDOMとJDOMを検討する価値があります。 JDOM開発者は、公式リリースの前にパフォーマンスの観点からパフォーマンスの問題に焦点を当てることを期待していると述べていますが、実際には推奨していません。さらに、DOMは依然として非常に良い選択です。 DOM実装は、さまざまなプログラミング言語で広く使用されています。また、公式にはW3Cの推奨事項(非標準ベースのJavaモデルとは対照的に)であるため、他の多くのXML関連標準の基礎でもあるため、一部の種類のプロジェクトでも(JavaScriptでDOMを使用するなど)、必要になる場合があります。
SAXはより良いパフォーマンスを発揮します。これは、特定の解析方法(イベント駆動型に依存します。 SAXは今後のXMLストリームを検出しますが、メモリにロードされません(もちろん、XMLストリームが読み取られると、一部のドキュメントは一時的にメモリに隠されます)。
4つのXML操作方法の基本的な使用
XMLファイル:
<?xmlバージョン= "1.0" encoding = "gb2312"?> <result> <value> <no> a1234 </addr> </value> </result>
1)DOM実装方法
Import java.io。*; Import Java.util。*; Import org.w3c.dom。*; Import javax.xml.parsers。 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( "nicention plate number:"+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 extend 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( "run time:" +(system.currenttimemillis() - lasting) + "milliseconds");} public void characlet(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")){address: " + new string(ch、start、length));}} wibuptartelement(auri、string uri、string atring、String arter、string 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 []){loge lasting = system.currenttimemillis(); try {saxbuilder builder = new SaxBuilder(); document doc = builder.build(new file( "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")。 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。*; public class myxmlreader {public static void main(string arge []){loge lasting = system.currenttimemillis(); try {file f = new file( "data_10k.xml"); saxreader reader = new Saxreader(); document doc = reader.read(f);要素root = doc.getRootelement();要素foo; for(iterator i = root.elementiterator( "value"); i.hasnext(){foo =(ement)i.next(); system.out.print( " + foo.elementtext(" no ")); out.println(" owner'sアドレス: " + foo.elementtext(" + foo.elementtext( "addr"); e.printstacktrace();})