私たち全員が知っているように、現在XMLを解析する方法はますますありますが、4つの主流の方法しかありません。
以下は、これらの4つの方法のJARパッケージダウンロードアドレスを提供する最初のものです
DOM:現在のJava JDK、XML-APIS.JARパッケージにあります
SAX: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はツリーベースまたはオブジェクトベースであると見なされます。
【アドバンテージ】
applicationアプリケーションがデータと構造を変更できるようにします。
cassionアクセスは双方向であり、いつでもツリーを上下にナビゲートし、データの任意の部分を取得および操作することができます。
【欠点】
cullerd通常、XMLドキュメント全体をロードして、多くのリソースを消費する階層を構築する必要があります。
2。Sax(XMLの単純API)
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パーサーを使用する場合、エンコーディングは困難であり、同じドキュメントで複数の異なるデータに同時にアクセスすることは困難です。
【利点】
ollyすべてのデータが処理されるのを待つ必要はなく、分析はすぐに開始できます。
dataデータを読み取るときにのみデータを確認しますが、メモリに保存する必要はありません。
documentドキュメント全体を解析することなく、特定の条件が満たされたときに解析を停止できます。
cire効率とパフォーマンス、およびシステムメモリよりも大きいドキュメントを解析できます。
【欠点】
compaliapsアプリケーションは、タグのロジックの処理(親と子の関係を維持するなど)の処理に責任を負う必要があります。ドキュメントが複雑になればなるほど、プログラムはより複雑です。
②ワンウェイナビゲーションはドキュメントの階層を見つけることができず、同じドキュメントのデータのさまざまな部分に同時にアクセスすることは困難であり、XPathをサポートしていません。
3。JDOM(Javaベースのドキュメントオブジェクトモデル)
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ライセンスバリアントの下でリリースされたオープンソースです。
【アドバンテージ】
インターフェイスの代わりにコンクリートクラスを使用し、DOM APIを簡素化します。
java開発者を促進するために、多数のJavaコレクションクラスが使用されています。
【欠点】
hood優れた柔軟性はありません。
②パフォーマンスが悪い。
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開発者を促進し、パフォーマンスを改善するためのいくつかの代替方法を提供するために広く使用されています。
support xpath。
③パフォーマンスが良いです。
【欠点】
interfaceインターフェイスは広範囲に使用されており、APIは比較的複雑です。
2。比較
1。Dom4Jは最高のパフォーマンスを持ち、SunのJaxmでさえDom4Jを使用します。現在、多くのオープンソースプロジェクトでは、有名なHibernateがDOM4Jを使用してXML構成ファイルを読み取るなど、大量にDOM4Jを使用しています。移植性が考慮されない場合、DOM4Jが使用されます。
2。JDOMとDOMは、パフォーマンステスト中にパフォーマンスが低下し、10mのドキュメントをテストするときはメモリオーバーフローですが、ポータブルです。また、小さなドキュメントの場合はDOMとJDOMを検討する価値があります。 JDOM開発者は、公式リリースの前にパフォーマンスの観点からパフォーマンスの問題に焦点を当てることを期待していると述べていますが、実際には推奨していません。さらに、DOMは依然として非常に良い選択です。 DOM実装は、さまざまなプログラミング言語で広く使用されています。また、公式にはW3Cの推奨事項(非標準ベースのJavaモデルとは対照的に)であるため、他の多くのXML関連標準の基礎でもあるため、一部の種類のプロジェクトでも(JavaScriptでDOMを使用するなど)、必要になる場合があります。
3. SAXはパフォーマンスが向上します。これは、特定の分析方法(イベント駆動型」に依存します。 SAXは今後のXMLストリームを検出しますが、メモリにロードされません(もちろん、XMLストリームが読み取られると、一部のドキュメントは一時的にメモリに隠されます)。
私の意見:XMLドキュメントが大きく、携帯性の問題を考慮しない場合、DOM4Jを使用することをお勧めします。 XMLドキュメントが小さい場合は、JDOMを使用することをお勧めします。データを保存せずに時間内に処理する必要がある場合は、SAXを考慮することをお勧めします。しかし、何があっても、同じ文は次のとおりです。一番いいのは正しいことです。時間が許せば、これらの4つの方法を試して、自分に合った方法を選択することをお勧めします。
iii。例
スペースを節約するために、これらの4つの方法とXMLドキュメントの作成における違いは、当面はここでは示されていません。 XMLドキュメントを解析するためのコードのみが与えられます。完全なプロジェクトが必要な場合(XMLドキュメントの構築 + XML +テストの比較)。
解析の例として、次のXMLコンテンツが次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <users> <user id = ""> <name> alexia </name> <age> 23 </age> <sex> sex> </user> <ユーザーID = "1"> <name> edward </name> <age> 24 </age> </sex> </sex> <name> wjm </name> <age> 23 </age> <sex> female </sex> </user> <user id = "3"> <name> wh </name> <age> 24 </age> <sex>男性</sex> </user> </user>
最初にXMLドキュメントの解析のインターフェイスを定義します。
/*** @author alexia** XMLドキュメントのインターフェイスを定義する*/public interface xmldocument {/*** parse xml document** @param filename*ファイルフルパス名*/public void parserxml(string filename);} 1。DOMの例
パッケージcom.xml; import java.io.filenotfoundexception; Import java.io.fileoutputStream; Import java.io.ioexception; Import java.io.io.printwriter; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfureftory; javax.xml.parsers.parserconfigurationexception; Import javax.xml.transform.outputkeys; Import javax.xml.transform.transformer; Import javax.xml.transform.transformerconfigurationception; Import Javax.xml.transform.fransformerexcection; import; import; 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.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.saxexception;/** * @author alexia * * dom dom parsing xml document */public class domdemoはxmldocument {private document document; public void parserxml(string filename){try {documentBuilderFactory dbf = documentBuilderFactory.NewInstance(); documentBuilder db = dbf.newdocumentbuilder(); document document = db.parse(filename); nodeList users = document.getChildNodes(); for(int i = 0; i <users.getLength(); i ++){node user = users.item(i); nodeList userInfo = user.getChildNodes(); for(int j = 0; j <userInfo.getLength(); j ++){node node = userinfo.item(j); 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() + ":" + userMetaem(k).getTextent(); } 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.fileenotfoundection; import java.io.fileoutputStream; Import java.io.ioexception; Import java.io.inputStream; Import java.io.OutputStream; Import Java.io.StringWriter; javax.xml.parsers.parserconfigurationexception; Import javax.xml.parsers.saxparser; Import javax.xml.parsers.saxparserfactory; Import javax.xml.transform.outputkeys; Import Javax.xml.ransform.ransform.ransult; import; javax.xml.transform.transformerconfigurationexception; import javax.xml.transform.sax.saxtransformerfactory; Import javax.xml.transform.sax.transformerhandler; Import javax.xml.transform.stream.stream; import javax.xml.transform.Stream; Import incom.xml.sax.tributes; org.xml.sax.sax.helpers.attributesimpl; Import org.xml.sax.helpers.defaulthandler;/** * @author alexia * * * Saxparsing xml Document */公開クラスxmldocument ben void pars pars pars pars fire) {saxparserfactory saxfac = saxparserfactory.newinstance(); try {saxparser saxparser = saxfac.newsaxparser(); inputstream is = 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 extends Defaulthandler {boolean hasattribute = false;属性属性= null; public void startdocument()throws saxexception {// system.out.println( "ドキュメントが印刷を開始しました"); } public void enddocument()throws saxexception {// system.out.println( "ドキュメントは印刷を終了しました"); } public void startelement(string uri、string localname、string qname、属性属性)saxexception {if(qname.equals( "users")){return; } if(qname.equals( "user")){return; } if(attributes.getLength()> 0){this.attributes = attributes; this.hasattribute = true; }} public void endelement(string uri、string localname、string qname)throws saxexception {if(hasattribute &&(attributes!= null)){for(int i = 0; i <attributes.getLugent(); i ++){system.out.out.print.print(astributes.get.get.get. }}} public void文字(char [] ch、int start、int length)throws 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.jdomexcept.jdomexception; Import org.jdom2.jdomexception; org.jdom2.output.xmloutputter;/** * @author alexia * * jdom parsing xml documents * */public class jdomdemoはxmldocument {public void parserxml(string filename){saxbuilder builder = new saxbuilder(); try {document document = builder.build(filename);要素ユーザー= document.getRootElement(); list userlist = users.getChildren( "user"); for(int i = 0; i <userlist.size(); i ++){element user =(element)userlist.get(i); list userinfo = user.getChildren(); for(int j = 0; j <userininfo.size(); j ++){system.out.println(((element)userinfo.get(j))。 } system.out.println(); }} catch(jdomexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); }}} 4。DOM4Jの例
パッケージ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; org.dom4j.io.saxreader; Import org.dom4j.io.xmlwriter;/** * @author alexia * * dom4j parse xml document */public class dom4jdemoはxmldocument {public void parserxml(string filename){file inputxml = filename(filename); saxreader saxreader = new saxreader(); try {document document = saxreader.read(inputxml);要素ユーザー= document.getRootElement(); for(iterator i = users.elementiterator(); i.hasnext();){element user =(element)i.next(); for(iterator j = user.elementiterator(); j.hasnext();){element node =(element)j.next(); System.out.println(node.getName() + ":" + node.getText()); } system.out.println(); }} catch(documentException e){system.out.println(e.getmessage()); }}}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。