1。序文
DOM4Jは非常に優れたJavaオープンソースAPIであり、主にXMLドキュメントの読み書きに使用され、優れたパフォーマンス、強力な機能、非常に便利な使用があります。さらに、XMLは、Webサービスで渡されたパラメーターの呼び出しやデータ同期操作の実行など、データ交換キャリアによく使用されるため、Dom4Jを使用してXMLを解析することが非常に必要です。
2。準備条件
dom4j.jar
住所をダウンロード:http://sourceforge.net/projects/dom4j/
3. dom4jを使用して練習します
1。XMLドキュメントの解析
実装のアイデア:
<1> XMLパスを読んだ後、SaxReaderに渡され、ドキュメントオブジェクトを返します。
<2>次に、このドキュメントオブジェクトを操作して、次のノードと子供の情報を取得します。
特定のコードは次のとおりです。
java.io.fileをインポートします。 JavaiofileInputStreamをインポートします。 JavaioInputStreamをインポートします。 Javautiliteratorをインポートします。 Javautillistをインポートします。 orgdom4jdocumentをインポートします。 orgdom4jdocumenthelperをインポートします。 orgdom4jelementをインポートします。 orgdom4jiosaxreaderをインポートします。 /** * dom4jを使用してXMLドキュメントを解析します * @Author Administrator * * */public class dom4jparsexmldemo {public void parsexml01(){// srcの下のxmlを変換して入力inputstream inputstream = new fileinputStream(新しいファイル(新しいファイル/src/src/src/src/src) // inputstream inputstream = thisgetClass()getResourceAsStream( "/modulexml"); //クラスのコンパイルされたファイルの相対パスに基づいてXMLを見つけることもできます// XML SaxReader saxreader = new SaxReader()を読むために特別に使用されるSaxReaderリーダーを作成することもできます。 // saxreaderの読み取り書き込み方法によると、入力ストリーム入力ストリームを介して読み取ることができます。 document document = saxreaderRead(new File( "d:/project/dynamicweb/src/resource/modulexml")); // document document = documenthelperparsetext( "<?xml version =/" 0/"encoding =/" utf-8/"?> <モジュールid =/" 123/"> <モジュール>これは、モジュールタグのテキスト情報</モジュール> </モジュール>"); //ルートノードオブジェクト要素rootelement = documentGetRootElement()を取得します。 SystemOutPrintln( "rootノード名:" + rootelementgetName()); //ノード名SystemOutPrintlnを取得する( "ルートノードの属性の数:" + rootelementAttributeCount());ノード属性ID systememoutprintln( "ルートノードのテキスト:" + rootelementgetText()); //要素に子供がいる場合、それは空の文字列を返し、ノードのテキストが返されます// rootelementgetText()ラインが壊れる理由SystemOutPrintln( "Text(1):" + rootelementgetTextTrim()); //削除されたのは、タグとタグの間のタブキーとラインブレークなどです。コンテンツSystemOutPrintlnの前後のスペースではなく( "ルートノードチャイルドノードのテキストコンテンツ:" + rootelementgetStringValue()); //現在のノードですべての子ノードのテキスト情報を再帰的に返します。 //子ノードを取得要素= rootelementElement( "module"); if(element!= null){systemeputprintln( "sub-node text:" + elementgetText()); //子ノードとルートノードは要素オブジェクトであるため、操作方法は同じです} //しかし、場合によっては、XMLはより複雑で、仕様は統一されていません。特定のノードに直接javalangnullpointerexceptionはありません。そのため、要素オブジェクトを取得した後、最初にrootelementsetname( "root"); //ノード名Systemeputprintln( "ルートノードの変更後の名前が変更された後の名前が変更されているかどうかを決定する必要があります。 rootelementsettext( "text"); //タグSystemOutPrintln( "ルートノードが変更された後のテキスト:" + rootelementGetText())のテキストを変更する場合も同じことが言えます。 } catch(例外e){eprintstacktrace(); }} public static void main(string [] args){dom4jparsexmldemo demo = new dom4jparsexmldemo(); demoparsexml01(); }}さらに、上記のXMLはSRCの下にあり、module01.xmlは次のとおりです。
<?xml version = "0" encoding = "utf-8"?> <モジュールid = "123"> <モジュール>これは、モジュールタグのテキスト情報</module> </modules>
次に、このクラスの主な方法を実行すると、コンソール効果は次のとおりです。
これから私たちは知っています:
<1> XMLファイルを読み取る方法はたくさんあります。
<2>要素オブジェクトのテキストとラベル名を取り出すのは非常に簡単です。
<3>そして、要素のテキストとラベル名を変更するのは非常に便利ですが、ディスクXMLファイルには書き込まれません。
上記は、XMLのルートディレクトリの要素を取得し、Iterator Iteratorを使用してドキュメントオブジェクトをループするだけです。
特定のコードは次のとおりです。
public void parsexml02(){try {// srcの下のxmlを入力ストリームinputstream inputstream = thisegetclass()getResourceasStream( "/modulexml"); // XML saxreader saxreader = new Saxreader()を読むために特別にSaxReaderリーダーを作成します。 // saxreaderの読み取りメソッドによると、inputstream inputストリームを介して読み取るか、ファイルオブジェクトを介して読み取ることができます。要素rootelement = documentgetRootelement(); iterator <lement> modulesiterator = rootelementelements( "module")iterator(); // rootelementelement( "name");特定の子要素を取得する// rootelementelements( "name");ルートノードの下に子要素のノードのセットを取得し、リストコレクションタイプ// rootelementelements( "module")iterator()を返します。返されたリストコレクションの各要素を反復し、すべてのチャイルドノードをiteratorコレクションに返しますwhile(modulesitatorhasnext()){element moduleElement = modulesiteratornext();要素namelement = moduleelementelement( "name"); SystemOutPrintln(nameElementGetName() + ":" + nameElementGetText()); Element ValueElement = ModuleElementElement( "Value"); SystemOutPrintln(valueElementGetName() + ":" + valueElementGetText());要素説明element = moduleelementelement( "descript"); SystemOutPrintln(DescriptElementGetName() + ":" + describeElementGetText()); }} catch(例外e){eprintstacktrace(); }}さらに、上記のXMLはSRCの下にあり、module02.xmlは次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <modules id = "123"> <module> <name> oa </name> <balue>基本システム構成</value> <説明>基本システム構成</descript> </modules> </modules>
次に、このクラスの主な方法を実行すると、コンソール効果は次のとおりです。
これから私たちは知っています:
<1> dom4Jは、XMLサブエレメントを超えて非常に効率的で便利です。
ただし、上記はXMLの子ノード要素を単純に繰り返しますが、次にテストするmodule03.xmlなど、XMLルールがより複雑な場合、詳細は次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <modules id = "123"> <odule>これは、モジュールタグのテキスト情報</module> <モジュール> <モジュール> <モジュール> "" "> <name> <値>基本システム構成</value> </value> <記述>これがsubmot> <moduble> </module> <module> <name>管理構成</name> <value>なし</value> <descript>構成を管理するための命令</descript> <モジュールid = "106"> <name> name management </name> <value> 0 </value> <descript> config </descript> <module id = "107 <Decrupt>番号</DESCRIPT> </module> </module> </module> </modules>
それらの構造は異なるため、直接反復すると、エラーが報告されます。
java.lang.nullpointerexception
したがって、この時点で慎重に使用する必要があります。毎回要素を直接反復することはできません。特定の実装コードは次のとおりです。
public void parsexml03(){try {// srcの下のxmlを入力ストリームinputstream inputstream = thisegetclass()getResourceasStream( "/modulexml"); // XML saxreader saxreader = new Saxreader()を読むために特別にSaxReaderリーダーを作成します。 // saxreaderの読み取りメソッドによると、inputstream inputストリームを介して読み取るか、ファイルオブジェクトを介して読み取ることができます。要素rootelement = documentgetRootelement(); if(rootelementelements( "module")!= null){// for(要素要素:elementList){if(!elementGetTextTrim()equals( "")){systemOutPrintln( "【1】" + elementgetTexttrim()); } else {要素namelement = elementelement( "name"); SystemOutPrintln( "【2】" + namelementgetName() + ":" + namelementgetText()); Element ValueElement = ElementElement( "Value"); SystemOutPrintln( "【2】" + valueElementGetName() + ":" + valueElementGetText());要素説明element = elementelement( "descript"); SystemOutPrintln( "【2】" + descriptionElementGetName() + ":" + descriptionElementGetText());リスト<lement> subelementlist = elementelements( "module"); for(element subelement:subelementlist){if(!subelementgetTexttrim()equals( "")){systemoutprintln( "【3】" + subelementgetTexttrim()); } else {element subnameelement = subelementelement( "name"); SystemOutPrintln( "【3】" + subNameElementGetName() + ":" + subnameElementGetText());要素subvalueElement = subelementelement( "value"); SystemOutPrintln( "【3】" + subvalueElementGetName() + ":" + subvalueElementGetText()); Element SubDescriptElement = SubElementElement( "Decript"); SystemOutPrintln( "【3】" + subdescriptelementgetName() + ":" + subdescriptelementgetText()); }}}}}}} catch(例外e){eprintstacktrace(); }}次に、このクラスの主な方法を実行すると、コンソール効果は次のとおりです。
OK、これで、反復文書で空の参照の問題を解決できます。
さらに、ループ内の子要素を削除する動作が繰り返され、再帰によって改善される可能性があるため、実際にはリファクタリングできますが、読みやすさは少し悪化します。
XMLのすべてのテキスト情報を取得する必要がある場合、または他の人が渡すXML形式が標準化されていない場合、タグの名前はケースに敏感ですが、XMLは症例に敏感ではありませんが、ペアに表示する必要があります。したがって、これを回避するために、すべてのタグ名を単純に大文字に変更することができます。特定のコードは次のとおりです。
public static void main(string [] args){string str = "<?xmlバージョン=/" 0/"encoding =/" utf-8/"?> <モジュールid =/" 123/"> <モジュール>これは、モジュールタグのテキスト情報<名> oa </name </name> <値>基本的な構成System </descript> </module> </modules> "; SystemUtPrintln(strreplaceall( "<[^<]*>"、 "_"));パターンパターン= patternCompile( "<[^<]*>"); Matcher matcher = patternMatcher(str); while(matcherfind()){str = strreplaceall(matchergroup(0)、matchergroup(0)touppercase()); } SystemOutPrintln(str); }実行後、レンダリングは次のとおりです。
2。XMLドキュメントを生成します
Dom4JはXMLを解析でき、XMLを確実に生成し、使いやすいです。
実装のアイデア:
<1> documentHelperは、ドキュメントオブジェクトを作成する方法を提供します。
<2>このドキュメントオブジェクトを操作し、ノードの下にノードとテキスト、名前、属性値を追加します。
<3>次に、XMLWriterライターを使用して、カプセル化されたドキュメントオブジェクトをディスクに書きます。
特定のコードは次のとおりです。
java.io.filewriterをインポートします。 JavaioioExceptionをインポートします。 Javaiowriterをインポートします。 orgdom4jdocumentをインポートします。 orgdom4jdocumenthelperをインポートします。 orgdom4jelementをインポートします。 orgdom4jioxmlwriterをインポートします。 /** * dom4jを使用してxmlドキュメントを生成 * @author Administrator * * */public class dom4jbuildxmldemo {public void build01(){try {// documenthelperはドキュメントオブジェクトを作成する方法を提供しますdocument document = documenthelpercreatedocument(); //ノード情報要素rootelement = documentAdlement( "modules"); //これにより、子ノードが追加され続けるか、Content rootelementsettext( "これはモジュールタグのテキスト情報です")を指定できます。要素要素= rootelementAddelement( "module");要素namelement = lementaddelement( "name"); Element ValueElement = ElementAdlement( "Value");要素説明element = lementaddelement( "description"); namelementsettext( "name"); NameElementAddattribute( "Language"、 "Java"); // node varyelementsettext( "value")の属性値の値を追加ValueElementAdDattribute( "Language"、 "c#"); descriptionElementSettext( "説明"); DescriptionElementAdDattribute( "Language"、 "SQL Server"); SystemOutPrintln(documentsxml()); //ドキュメントオブジェクトを文字列出力writerwriter = new filewriter( "c:// modulexml")に直接変換します。 // dom4jは、ファイルに特別に書かれたオブジェクトを提供しますxmlwriter xmlwriter xmlwriter = new xmlwriter(filewriter); xmlwriterwrite(document); xmlwriterflush(); xmlwriterclose(); SystemOutPrintln( "XMLドキュメントが正常に追加されました!"); } catch(ioexception e){eprintstacktrace(); }} public static void main(string [] args){dom4jbuildxmldemo demo = new dom4jbuildxmldemo(); demobuild01(); }}コードを実行する効果は次のとおりです。
次に、以下のCドライブに移動して、作成が成功したかどうかを確認します。 XMLファイルのコンテンツは、コンソールによるコンテンツ出力と同じであることが判明しました。
さらに、上記の生成されたXMLはエンコード形式を指定していませんが、UTF-8はまだ表示されており、これがデフォルトのエンコード形式であることを示しています。再特定する場合は、document.setxmlencoding( "gbk")を追加できます。ディスクに書き込む前に。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。