XMLは「何にもしない」ように設計されており、XMLはデータを組織し、保存するためだけに使用される。それ以外のデータ生成、読み込み、送信などの操作はXML自体とは関係がない。
XML構文:<?xml version="1.0" encoding="utf-8" standalone="no"?>
- version:バージョン番号
- encoding:エンコード
- standalone:yes/no は独立して使用するかの判定。デフォルトはno
- ドキュメント宣言時に属性の順序は変更できない
要素:XMLの要素とタグは同じものである
注意:XMLの構文は規範であり、乱れた書き方は許されない
属性:XML要素の一部で、命名規則は要素と同じである
<!--属性名はname、属性値はchina-->
<国 name="china">
</国>
コメントとXMLは同様である
CDATA:含まれる内容は解析されず、そのままで出力される。構文:
<![CDATA[
...コンテンツ
]]>
処理命令(PI)はXMLパーサーがXMLコンテンツをどのように解析するかを通知するために使われる。
例:<?xml-stylesheet type="text/css" href="1.css"?>xml-stylesheet指令を使用し、XMLパーサーにCSSファイルを適用してXMLドキュメントを表示するように指示する
JDK内のXML API
- JAXP:XMLを解析するためのもの
- JAXB:XMLをJavaオブジェクトにマッピングするためのもの
何がXML解析なのか
解析方法
- DOM:ドキュメントオブジェクトモデル
- SAX:XMLコミュニティの標準
解析操作
プログラムがXMLドキュメントにアクセスするプロセスは、まずパーサーがドキュメントを分析し、その後プログラムがパーサーが提供するDOMインターフェースまたはSAXインターフェースを使用して分析結果を操作することで、間接的にXMLドキュメントにアクセスする。
一般的に使われるのは第3者解析ライブラリであり、dom4j(jdomをラップしており、それもDOMをラップしている)
JAXP(JDKに内蔵されている開発用ライブラリ)
DOM解析操作
DOM解析はオブジェクトベースのAPIであり、XMLの内容をメモリにロードし、XMLドキュメントの内容に対応するモデルを生成する。解析が完了すると、XMLドキュメントの構造に応じたDOMオブジェクトツリーがメモリに生成される。これにより、ツリー構造に従ってノード形式でドキュメントを操作できる。
簡単に言うと:DOM解析はXMLドキュメントをメモリに読み込み、DOMツリーの要素はすべてオブジェクトとして存在し、オブジェクトを通じてXMLドキュメントを操作する。DOMツリー:
XMLドキュメントのデータには関係性があり、そのため上記のDOMには親ノード、子ノード、兄弟ノード、後継ノード、祖先ノードの関係がある
カーネルインターフェース
- Document:XMLドキュメント全体(HTMLドキュメントも含む)を表す。DocumentノードからXMLファイル内のすべての要素をアクセスできる
- Node:XML操作インターフェースにおいて、Nodeノードは通常のJavaクラスのObjectに相当する(XMLインターフェースの親)。多くのカーネルインターフェースはこれを実装している
- NodeList:ノードの集合を表し、通常はノード内の子ノードの集合
- NameNodeMap:主に属性ノードを表し、一組のノードとそのユニークな名前の対応関係を表す
ノード間の関係:
DocumentもNodeインターフェースを実装しており、1つのDocumentは複数のNodeで構成されている。このため、Document自体もNodeであり、Javaのクラスもオブジェクトであるように見える。
dom4j解析技術
基本操作
public void Test1() throws DocumentException {
// 第一步、SAXReaderを使ってXMLファイルを読み込み、Documentオブジェクトを得る
SAXReader reader = new SAXReader();
Document doc = reader.read("x.xml");
// 第二步、Documentオブジェクトを使ってXMLのルート要素オブジェクトを得る
Element root = doc.getRootElement();
// 第三步、ルート要素を使ってすべてのbookタグオブジェクトを得る
//elements("タグ名")は現在の要素以下の指定された子要素の集合を得る
//このパラメータは最大の閉じタグでは使えない
List<Element> list = root.elements("Person");
// 第四步、各bookタグオブジェクトを繰り返し処理し、bookタグオブジェクト内の1つの要素を得る
//element("タグ名")は指定されたタグオブジェクト(Elementオブジェクト)を得る
//getText()メソッドで開始タグと終了タグの間のテキストコンテンツを得る
for(Element e : list){
System.out.println(e.element("boy").getText());
//asXML()メソッドで要素オブジェクトを文字列形式に変換する
System.out.println(e.asXML());
System.out.println(e.element("boy").asXML());
//elementText()メソッドでタグ内のテキストコンテンツを直接取得する
System.out.println(e.elementText("boy"));
}
}