DOM4Jはじめに
DOM4Jのプロジェクトアドレス:http://sourceforge.net/projects/dom4j/?source=directory
DOM4Jは、XML、XPath、XSLTを処理するためのシンプルなオープンソースライブラリであり、Javaプラットフォームに基づいており、Javaのコレクションフレームワークを使用して、DOM、SAX、JAXPを完全に統合しています。
DOM4Jは、DOM4Jプロジェクトをダウンロードした後にDOM4Jを使用し、それを解凍し、JARパッケージ(私の現在のバージョンはDOM4J-1.6.1.JARと呼ばれます)をクラスパスに追加します。
(プロパティ - > Javaビルドパス - >外部瓶の追加...)。
次に、プログラミングに提供するAPIを使用できます。
プログラム例1
最初のプログラムはJavaコードを使用してXMLドキュメントを生成し、コードは次のとおりです。
パッケージcom.example.xml.dom4j; Import java.io.fileoutputstream; Import java.io.filewriter; Import org.dom4j.document; Import org.dom4j.documenthel per; Import org.dom4j.element; Import org.dom4j。 io .outputformat; Import org.dom4j.io.xmlwriter;/** * dom4jフレームワークは、dom4jフレームワークを使用してxmlドキュメントと出力を作成し、 */public class dom4jtest1を保存することを学びます。 args)exception {//最初の方法:ドキュメントを作成してルート要素を作成します//ドキュメントを作成します。 root = documenthelper.createelement( "strootelement); document2 = documenthelp er.createdocument(root2); Element worldelement = root2.dd( "hello elect); .writ e(document); // file/ format outputformat format = new outputformat( ""、true); 「stud ent.xml」、format); filewriter(sudent2.xml ")、xmwrith3.flush();
プログラムコンソール出力:
<?xml version = "1.0" encoding = "utf-8"?> <student/>
生成されたXMLドキュメント:
<?xml version = "1.0" encoding = "utf-8"?> <学生名= "zhangsan"> <hello> hello text </hello> <world> world text </world> </desudent>
プログラム例2
プログラムの例2、XMLドキュメントを読んで分析し、その内容を出力します。
まず、分析すべきドキュメントは次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <学生name = "zhangsan"> <hello name = "lisi"> hello text1 </hello> <hello name = "lisi2"> hello text2 << :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: ::::::::::::::::::::::::::/hello> <hello name = "lisi3"> hello text3 < /hello> <world name = "wangwu "> world text1 </world> <world name =" wangwu2 "> world text2 </world> <world> world te xt3 </world> </sudints> package com.example.xml.dom4j; Import java.io. file; import java.util.iterator; Import java.util.list; import javax.xml.parsers .documentbuilder; import javax; import org.dom4j.document; Import org.dom4j.element; import org .dom4j.io.domeder; Import org.dom4j.io.saxread er;/** * dom4jフレームワーク学習:読み取りと解析xml * * * */public class dom4jtest2 {public static void main(string [] args)スロー例外{ saxreader saxreader = new saxreader(); " + root.getName()); //すべての子要素リスト<要素> childList = root.Elements(); system。out.println("総子カウント: " + childlist.size()); // get特定の名前の子要素<lement> root.elements( "hello");指定された名前要素firstworldelement = root.element( "world"); aTtivevalue( "name")); Iterator iter = root.hasnext(); println( "Domrederを使用------------------------------------------------ -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ----------------- DocumentBuilderFactory DBF = DocumentBuilderFactory.NewInstance(); w3c.dom.documentを使用する必要があります。要素rootelement = document.get rootelement();
コードが実行された後、出力は次のとおりです。
root:studentstotal Child count:6hello Child:3first world attr:name = wangwu Iterative output ----------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------- Ader --------------------------------------------------------------------- ------------------ルート:学生
SAXはXMLを解析します
以下は、サックスでエンティティの解析を実装する手順です
//以下は解析するXMLReaderです(i)ステップ1:新しい工場クラスのSaxParserFactoryを作成すると、コードは次のとおりです。
saxparserfactory Factory = saxparserfactory.newinstance();
(2)ステップ2:工場のクラスにサックスパーサークラスのsaxparserを生成させます。コードは次のとおりです。
saxparser parser = factory.newsaxparser();
(iii)ステップ3:saxpsrserからxmlreaderインスタンスを取得すると、コードは次のとおりです。
xmlreader reader = parser.getxmlreader();
(4)ステップ4:XMLReaderに書いたハンドラーを登録してください。最も重要なのはコンテンツハンドラーです。
reader.setContentHandler(this);
(v)ステップ5:XMLドキュメントまたはリソースをJavaが処理できる入力ストリームストリームに変えた後、解析は正式に開始され、コードは次のとおりです。
reader.parse(new inputSource(is));
//以下は、SaxParserを使用して解析するためです(i)最初のステップ:新しい工場クラスのSaxparserFactoryを作成すると、コードは次のとおりです。
saxparserfactory Factory = saxparserfactory.newinstance();
(2)ステップ2:工場のクラスにサックスパーサークラスのsaxparserを生成させます。コードは次のとおりです。
saxparser parser = factory.newsaxparser();
(3)ステップ3:XMLドキュメントまたはリソースをJavaが処理できる入力ストリームストリームに変えた後、解析は正式に開始され、コードは次のとおりです。
parser.parse(is、this);
誰もがコンテンツを開始する前に、私に詳細に説明します。
//ドキュメントコンテンツイベントが発生する場所を見つけることができるロケーターオブジェクトを設定します
public void setDocumentLocator(ロケーターロケーター)
//ドキュメントの解析開始イベントを処理するために使用されます
public void startdocument()はsaxexceptionをスローします
//要素の開始イベントを処理すると、要素がパラメーターから配置されている名前空間のURI、要素名、属性クラステーブル、およびその他の情報を取得できます。
public void startelement(string namespacesuri、string localname、string qname、属性atts)Saxexceptionをスローする
//要素の終了イベントを処理すると、要素がパラメーターから配置されている名前空間のURI、要素名、およびその他の情報を取得できます。
public void endelement(string namespacesuri、string localname、string qname)saxexceptionをスローする
//要素の文字コンテンツを処理すると、パラメーターからコンテンツを取得できます
public void文字(char [] ch、int start、int length)はsaxexceptionをスローします
ちなみに、xmlreaderにメソッドを紹介しましょう。
// XMLドキュメントの解析イベントContentHandlerを登録して処理します
public void setContentHandler(ContentHandler Handler)
// XMLドキュメントの解析を開始します
public void parse(inputsorce input)はsaxexceptionをスローします
次に話し合いました。
パッケージexample.demo。 ){return _id} public void _id) (){return _age;
次に、XMLを解析するコンテンツハンドラーを実装したい
ContentHandlerを実装するには、通常、次の手順が必要です
1.クラスを宣言し、DeFaulthandlerを継承します。 Defaulthandlerは基本クラスであり、コンテンツハンドラーを単に実装しています。内部のメソッドを書き直す必要があります。
2。startdocument()とenddocument()を書き直します。一般的に、正式な解析前の初期化はstartdocument()に配置され、最終作業はenddocument()に配置されます。
3。startelement()は、XMLパーサーがXMLでタグに遭遇したときに呼び出されます。多くの場合、LocalNameの値を判断することにより、この関数では一部のデータが動作します。
4。コールバックメソッドである文字()メソッドを書き直します。パーサーがstartelement()を実行した後、このメソッドはノードのコンテンツを解析した後に実行され、パラメーターch []はノードの内容です。
5。このメソッドは、このメソッドを解析した後、startelement()に対応していますDefaulthandlerとReREは、次の方法を書きます
パブリッククラスのsax_parserxmlは、defaulthandlerを拡張します{ / ***このイベントは、XMLファイルの宣言を解析するとトリガーされます** / @Override public void startdocument()メソッドスタブsuper.startdocument(); {// TODO自動生成方法Stub.StartElement(uri、localName、qname、属性); ] ch、int start、int length)saxexception {// todo auto-enerated method stub.characters(ch、start、length)} /** *エンドタグが読み取られるとトリガーされます。 @Override public void endelement(string uri、string localname、string qname)saxexception {// todo auto-enerated method super.endlement t(uri、localname、qname)}}}
まず、解析された人のデータを保存するリストを作成します
リスト<パーソン>人;
しかし?どこで初期化しますか? XMLファイルの宣言を解析するときにこのイベントがトリガーされるため、startdocument()で初期化することができます。
/ ***このイベントは、XMLファイルの宣言を解析するときにトリガーされます。 );
次に、分析を開始します
/ ***このイベントは、要素の開始タグを解析するときにトリガーされます**/ @Override public void startelement(string uri、string localname、string qname、属性属性)はsaxexceptionをスローします.StartElement(uri、cname、属性); attributes.getValue( "id"));
上記のコードでは、LocalNameは現在解析されている要素名を表します
//ステップ1は、新しい人オブジェクトを作成するかどうかを決定します。 ** *このイベントは、テキスト要素を読むときにトリガーされます。 、start、length); equals( "name")){//取得した値をset_name(txt);
次は、タグが終了したときに必要なことです
/ ***このイベントは、終了タグが読み取られるとトリガーされます**/ @Override public void Endelement(string uri、string localname、string qname)saxexceptionをスロー、localname、qname)は、localname.equals( "person"){persons.add(person); :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: :::::::::: "";
分析はおそらくプロセスです
1. StartElementメソッドは、要素の先頭に呼び出されます。
2.文字方法は次に呼ばれ、要素の値を取得するために使用できます。
3.要素が終了すると、解析が完了した後にエンデレメントメソッドが呼び出されます。
Public List <Person>(inputstream is){saxparserfactory.newinstance(); 2番目の方法XMLEDER.GETXMLREADER()人を返します。
上記のコードは、入力ストリームオブジェクトを渡すだけで、コードを読んだ後、
com.demo.util.inputstrem.till.list; .xml.sax.sax.saxexception; demo.parserxmlはdefolthers {inpers expers extens saxparser parser = newsaxparser(); (new inputSource(is));いくつかの初期化を行うことができます* / @Override public void startdocument( * *このイベントは、要素の開始タグを解析するとトリガーされます */ @Override public void startelement(string uri、string localName、string qname、属性属性)がsa xexception {// todo auto-generatedメソッドスタブスーパー。 startelement(uri、cname、属性); .getValue( "id"); SAXEXCエピソード{// TODO自動生成方法Stub Super.Characters(ch、start、length);開始、長さ);要素が名前であるかどうかを決定する( "name")) "age")){set_age(txt); SAXEXCエピソードをスロー{// TODO自動生成方法Stub Super.Endelement(urial、localname、qname)。人!= null){persons.add(人);
このクラスを呼び出す方法を書きます
list <person> sax_parserxml()。readxml(is); ); buffer.append( " + person.get_id() +" "); .get_age() + "/n"); toast.maketext(activity、buffer、toast.length_long).show();
次のインターフェイスの説明が表示された場合、分析は成功しています〜
まとめ:
DOM(ファイルオブジェクトモデル)解析:パーサーはドキュメント全体を読み取り、メモリレジデントツリー構造を構築し、コードはDOMインターフェイスに従ってこのツリー構造を操作できます。
利点:ドキュメント全体がメモリに読み込まれ、操作に便利です。変更、削除、複製や配置などのさまざまな機能をサポートします。
短所:ドキュメント全体をメモリに読み、不要なノードを保持しすぎて、メモリとスペースを無駄にします。
使用機会:ドキュメントが読み取られたら、ドキュメントを複数回操作する必要があり、ハードウェアリソースが十分である場合(メモリ、CPU)。
ドム解析に存在する問題を解決するために、サックス解析が発生します。その特性は次のとおりです。
利点:ドキュメント全体を実装する必要はありません。これにより、リソースが少なくなります。特にAndroidなどの埋め込み環境では、SAXの解析を使用することを強くお勧めします。
短所:DOM解析とは異なり、データは永続的ではありません。イベント後にデータが保存されない場合、データは失われます。
使用機会:マシンには性能の制限があります