DOM4JとXML文書の操作

dom4プロフィール

1、DOM4Jはdom4j.orgは、オープンソースのXML解析パッケージが製造されます。DOM4Jは、Java Collections Frameworkを使用して、Javaプラットフォームで使用すると、完全にDOM、SAXおよびJAXPをサポートしています。

   DOM4J最大の特徴は、多数のインターフェイスを使用することです。その主なインターフェイスはorg.dom4j内に定義されています

属性

これは、XML属性を定義します。

ブランチ

これは、子ノードが含まれていることを意味します。そのようなXML要素(エレメント)とマニュアル(Docuemnts)などの一般的な動作を定義します

CDATA

これは、XML CDATAエリアを定義します

CharacterData

これは、ノード識別子の文字に基づいて、マーカーインターフェイスです。CDATAとして、テキストをコメント。

コメント

これは、XMLコメントの動作を定義します

資料

これは、XML文書を定義します

DocumentType

定義されたXMLのDOCTYPE宣言

素子

カスタムXML要素

ElementHandler

要素オブジェクトは、プロセッサを定義します

ElementPath

パスを処理されている情報の現在のレベルを取得するために、ElementHandler使用されています

エンティティ

定義されたXMLエンティティ

ノード

多型の挙動は、XMLノードのすべてのように定義されるのdom4j

NodeFilter

これは、ノード(predicateA)で生成されたフィルタやDOM4J述語の動作を定義します

処理命令

カスタムXML処理命令

テキスト

カスタムXMLテキストノード

ビジター

Visitorパターンを実装するための

XPathの

文字列解析の後、XPath式を提供します

図2に示すように、これらのインタフェース間の関係は次のように

  インタフェースjava.lang.Cloneable

      インタフェースorg.dom4j。ノード

             インタフェースorg.dom4j.Attribute

             インタフェースorg.dom4j.Branch

                    インタフェースorg.dom4j.Document

                    インタフェースorg.dom4j.Element

             インタフェースorg.dom4j.CharacterData

                    インタフェースorg.dom4j.CDATA

                    インタフェースorg.dom4j.Comment

                    インタフェースorg.dom4j.Text

             インタフェースorg.dom4j.DocumentType

             インタフェースorg.dom4j.Entity

             インタフェースorg.dom4j.ProcessingInstruction

XML文書

1. XMLとは何ですか?

  標準一般化マークアップ言語の拡張マークアップ言語のサブセットは、XMLと呼ばれます。構造化マークアップ言語を持っている電子文書のためのマーカーです。

  拡張可能な手段は、カスタムラベルすることができ、ラベルは<学校> </学校>の存在ことに注意しなければならないペア

  データを記憶するためのプロファイル、送信データ

2、XML構造 

  <?XMLバージョンは=「1.0 」エンコード=「UTF-8」> ヘッダが存在しなければならない
  XML:?XML宣言は文書である
  バージョン:バージョンの
  符号化:符号化フォーマット

  以下では、コンテンツのヘッダ部であります

3、XMLの書き込み仕様は
  大文字と小文字を区別しません1.xmlはなく、XML総額敏感。
  2.xmlキーワードタグを使用することができない、例えば、版XML
  適切にネストされた3.
  4は、数字で始まることができない
  唯一のルートタグ5.

4、XML文書を読みます

  最初のステップ:ドキュメントオブジェクトを取得します。

パブリック 静的ドキュメント荷重(文字列のファイル名){   
    文書ドキュメント = NULL ;  
    試す{   
        SAXReader saxReader = 新しいSAXReader();  
        ドキュメント = saxReader.read(新しいファイル(ファイル名)); // 读取XML文件、获得文書对象   
    } キャッチ(例外例){   
        ex.printStackTrace();  
    }   
    戻り文書。  
}   
  
パブリック 静的ドキュメント荷重(URLのURL){   
    文書ドキュメント = NULL ;  
    試します{   
        SAXReader SAXReader = 新しい新しいSAXReader();   
        ドキュメント = saxReader.read(URL); //はドキュメントオブジェクトを取得するためにXMLファイルを読み込む   
    } キャッチ(例外EX)を{   
        ex.printStackTraceを();   
    }   
    戻りドキュメント;   
}  

  ステップ2:ルートを取得

素子document.getRootElementルート=();  

  第三段階:トラバースのルートノード

 ため(それは=イテレータ; it.hasNext(); root.elementIteratorを()){       
      element要素 = (要素)it.next();      
      // 何かをします       
 }   

  アクセスノードの内容:第四工程

ストリング・テキスト= element.getText()。

5、関連する多数の方法

  5.1、ドキュメント関連するオブジェクト        

    1、ドキュメントオブジェクトを取得するには、XMLファイルを読み込みます。     

         SAXReaderリーダー=新しいSAXReader()。 

        文書ドキュメント= reader.read(新しいファイル( "input.xmlに"));     

    2、構文解析XMLテキスト形式は、ドキュメントオブジェクトを取得します。      

             文字列のテキスト= "<メンバー> </メンバー>";     

             文書ドキュメント= DocumentHelper.parseText(テキスト);     

    3、ドキュメントオブジェクトを作成するためのイニシアチブをとります。      

             文書の文書= DocumentHelper.createDocument()。     

             要素のルート= document.addElement(「メンバー」); //ルートノードを作成します。     

  5.2、ノード関連        

    1.文書のルートを取得します。      

    素子rootElm document.getRootElement =();     

    2.ノードの単一の子ノードを取得します。      

    素子memberElm = root.element(「メンバー」); //「部材」ノード名     

    3.テキストノードを取得するには      

    ストリング・テキスト= memberElm.getText()。     

    文字列のテキスト= root.elementText(「名前」);ポイントは、ルートノードの下にバイト文字の名前を得ることです。       

    4.指定された名前とノードのトラバーサルの下のすべてのノードを取得します。      

    リストノード= rootElm.elements(「メンバー」)。     

    用(= nodes.iterator()をイテレータ; it.hasNextを()){     

       要素ELM =(要素)it.next();     

       //何かをします     

    }     

      ノードのすべての子ノードの5トラバーサル。      

              ため(それはroot.elementIterator()=イテレータ; it.hasNextを()){     

                   素子要素=(要素)it.next();     

                  //何かをします     

               }     

    6.ノードに子ノードを追加します。      

      要素ageElm = newMemberElm.addElement( "年齢");     

    7.テキストノードを設定します。      

      ageElm.setText( "29");     

    8.ノードを削除します。      

      parentElm.remove(childElm); //ノードchildElm削除する、parentElmは、その親であります     

    9. CDATAノードを追加します。      

             素子contentElm = infoElm.addElement( "コンテンツ")。     

             contentElm.addCDATA(diary.getContent())。          

  5.3、不動産関連。     

    1.指定された属性ノードを取得      

             素子document.getRootElementルート=();         

             属性= root.attribute(「サイズ」)を属性。//属性名の名前     

    2.テキスト属性を取得します      

         ストリング・テキスト= attribute.getText()。   

    文字列テキスト2 = root.element( "名前")属性値( "FIRSTNAME")。

    //これは、name属性の値は、ルートノードの下に作られたfirstnameのポイントバイトです。      

    3.ノードのすべての属性を横切ります      

    素子document.getRootElementルート=();

    ため(それはroot.attributeIterator()=イテレータ; it.hasNextを()){

      属性=(属性)属性it.next();

      ストリング・テキスト= attribute.getText()。

      System.out.println(テキスト);

    }

    4.ノードの属性とテキストを設定します。      

      newMemberElm.addAttribute( "名前"、 "sitinspring");   

    5. Textプロパティを設定します。      

               属性= root.attribute(「名前」)を属性。     

               attribute.setText( "sitinspring");     

    6.プロパティを削除します。      

               属性= root.attribute( "サイズ")を属性; //属性名の名前     

               root.remove(属性);     

  5.4、XMLファイルにドキュメントを書き込みます。     

    1.文書はすべて英語である、ちょうど書き、エンコーディングを設定しないでください。      

    XmlWriterライター=新しいするXMLWriter(新てFileWriter( "のOutput.xml"));     

    writer.write(文書)。     

    writer.close();     

    中国を含む2.文書は、エンコード形式を設定してから書いてください。     

    フォーマットOUTPUTFORMAT = OutputFormat.createPrettyPrint()。

    ( "GBK")format.setEncoding; //はXMLエンコーディングを指定します

    XmlWriterライター=新しいするXMLWriter(新てFileWriter( "のOutput.xml")、フォーマット)。

    writer.write(文書)。

    writer.close();

  5.5、およびXML列変換      

    XMLへの1列      

    文字列のテキスト= "<メンバー> <メンバー> sitinspring </メンバー> </メンバー>";     

    文書ドキュメント= DocumentHelper.parseText(テキスト);     

    文字列に2. XML文書またはノード。     

    SAXReaderリーダー=新しいSAXReader()。

    文書ドキュメント= reader.read(新しいファイル( "input.xmlに"));

    素子document.getRootElementルート=();

    ストリングdocXmlText = document.asXML()。

    ストリングrootXmlText = root.asXML()。

    素子memberElm = root.element( "メンバー")。

    ストリングmemberXmlText = memberElm.asXML()。

Xpath

1、XPathはにJaxen-XX-xx.jarを導入する必要性を見つける使用して

図2に示すように、従来の方法

    リスト一覧=ドキュメント。selectNodes( "/書籍/書籍/ @ショー");

3、構文

  図1に示すように、ノードを選択します

  XML文書、または選択されたステップへのパスに沿ってノードに経路選択ノードを使用してXPath式。

  一般的なパス式:

表現

説明

ノード名

現在のノードのすべての子ノードを選択します

/

ルートノードから選択します。

//

現在のノードから選択することに関係なく、それらの位置の、ドキュメント内の選択されたノードと一致します

現在のノードを選択します

。..

現在のノードの親を選択します

@

[プロパティ]を選択します

  例:

パス式

結果

本屋

書店要素のすべての子ノードを選択します

/書店

ルート要素の書店を選択

書店/書籍

名の下に本を書店のすべてを選択する子要素

//本

选取所有 book 子元素,而不管它们在文档中的位置。

bookstore//book

选取bookstore 下名字为 book的所有后代元素,而不管它们位于 bookstore 之下的什么位置。

//@lang

选取所有名为 lang 的属性。

  2、谓语

路径表达式

结果

/bookstore/book[1]

选取属于 bookstore 子元素的第一个 book 元素。

/bookstore/book[last()]

选取属于 bookstore 子元素的最后一个 book 元素。

/bookstore/book[last()-1]

选取属于 bookstore 子元素的倒数第二个 book 元素。

/bookstore/book[position()<3]

选取最前面的两个属于 bookstore 元素的子元素的 book 元素。

//title[@lang]

选取所有拥有名为 lang 的属性的 title 元素。

//title[@lang='eng']

选取所有 title 元素,要求这些元素拥有值为 eng 的 lang 属性。

/bookstore/book[price>35.00]

选取所有 bookstore 元素的 book 元素,要求book元素的子元素 price 元素的值须大于 35.00。

/bookstore/book[price>35.00]/title

选取所有 bookstore 元素中的 book 元素的 title 元素,要求book元素的子元素 price 元素的值须大于 35.00

  3、选取未知节点

    XPath 通配符可用来选取未知的 XML 元素。

通配符

描述

*

匹配任何元素节点

@*

匹配任何属性节点

node()

匹配任何类型的节点

    实例

路径表达式

结果

/bookstore/*

选取 bookstore 元素的所有子节点

//*

选取文档中的所有元素

//title[@*]

选取所有带有属性的 title 元素。

  4、选取若干路径

    通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

    实例

路径表达式

结果

//book/title | //book/price

选取所有 book 元素的 title 和 price 元素。

//title | //price

选取所有文档中的 title 和 price 元素。

/bookstore/book/title|//price

选取所有属于 bookstore 元素的 book 元素的title 元素,以及文档中所有的 price 元素。

  5、XPath 轴

    轴可定义某个相对于当前节点的节点集。

轴名称

结果

ancestor

选取当前节点的所有先辈(父、祖父等)

ancestor-or-self

选取当前节点的所有先辈(父、祖父等)以及当前节点本身

attribute

选取当前节点的所有属性

child

选取当前节点的所有子元素。

descendant

选取当前节点的所有后代元素(子、孙等)。

descendant-or-self

选取当前节点的所有后代元素(子、孙等)以及当前节点本身。

following

选取文档中当前节点的结束标签之后的所有节点。

namespace

选取当前节点的所有命名空间节点

parent

选取当前节点的父节点。

preceding

选取文档中当前节点的开始标签之前的所有节点。

preceding-sibling

选取当前节点之前的所有同级节点。

self

选取当前节点。

  6、步的语法:轴名称::节点测试[谓语]

    实例

例子

结果

child::book

选取所有属于当前节点的子元素的 book 节点

attribute::lang

选取当前节点的 lang 属性

child::*

选取当前节点的所有子元素

attribute::*

选取当前节点的所有属性

child::text()

选取当前节点的所有文本子节点

child::node()

选取当前节点的所有子节点

descendant::book

选取当前节点的所有 book 后代

ancestor::book

选择当前节点的所有 book 先辈

ancestor-or-self::book

选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话)

child::*/child::price

选取当前节点的所有 price 孙。

 

  7、XPath 运算符

运算符

描述

实例

返回值

|

计算两个节点集

//book | //cd

返回所有带有 book 和 ck 元素的节点集

+

加法

6 + 4

10

-

减法

6 - 4

2

*

乘法

6 * 4

24

div

除法

8 div 4

2

=

等于

price=9.80

如果 price 是 9.80,则返回 true。

如果 price 是 9.90,则返回 fasle。

!=

不等于

price!=9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 fasle。

小于

price<9.80

如果 price 是 9.00,则返回 true。

如果 price 是 9.90,则返回 fasle。

<=

小于或等于

price<=9.80

如果 price 是 9.00,则返回 true。

如果 price 是 9.90,则返回 fasle。

大于

price>9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 fasle。

>=

大于或等于

price>=9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.70,则返回 fasle。

or

price=9.80 or price=9.70

如果 price 是 9.80,则返回 true。

如果 price 是 9.50,则返回 fasle。

and

price>9.00 and price<9.90

如果 price 是 9.80,则返回 true。

如果 price 是 8.50,则返回 fasle。

mod

计算除法的余数

5 mod 2

1

おすすめ

転載: www.cnblogs.com/xfdhh/p/11408849.html