XMLの学習ノート

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

  1. JAXP:XMLを解析するためのもの
  2. 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"));
        }
    }

タグ: XML dom 解析 SAX dom4j

8月22日 01:52 投稿