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 |