XMLとは何か
公式docは以下のものがある
Extensible Markup Language(拡張可能なマークアップ言語)の略、拡張子は「.xml」
プログラミング初学者がProgateとかで最初にさわるHTMLと異なり、タグを新たに定義することができることに大きな特徴がある。
「タグを新たに定義することができる」という特徴は言葉を悪く言えば好き勝手にルールを構築できるとも言い換えられる。そのため往々にして、XMLを利用している団体・企業間ごとに規格があり、以下のXMLの開発元のW3C(World Wide Web Consortium) も大枠のXML規格を随時策定・更新している
W3Cの検索フォーム
XPathとかSVGもW3Cが標準(Standard)化している規格(及びその規格に則った技術) で、上のサイトで検索すると、最新の規格が出てくる
W3Cはプログラミング言語そのものではなく、「Webで使われる技術(言語・仕様)」の標準を定めている
※HTML、CSSもW3Cによって標準化されている。
上で検索すると出てくる規格は完全に採択されているわけではなく、以下の5段階のものが入り交じっている
| 段階 | 名称 | どういう状態か |
|---|---|---|
| 1 | ノート(草案)(Note) | 企業や団体からの提案が一定の条件を満たしたもの |
| 2 | ドラフト (Working Draft) |
ノートのうち、まとめられた案を公開したもの |
| 3 | 勧告候補(Candidate Recommendation) | ドラフトに対して何度か改定し、勧告案の候補を公開したもの |
| 4 | 勧告案(Proposed Recommendation) | ドラフトの中で正式な仕様となるものを公開したもの |
| 5 | 勧告(Recommendation) | W3Cのメンバーの投票によって認められたもの |
XMLの「タグ新規作成」以外の特徴
(1)データの階層構造(=親子関係)をタグ名を通して表現できる
例えば、
<製品情報>
<製品A>
<製品名>
A
</製品名>
<価格>
50000
</価格>
</製品A>
<製品B>
<製品名>
B
</製品名>
<価格>
70000
</価格>
</製品B>
</製品情報>
の場合、次の階層構造を表していることになる
製品情報----製品A----製品名----A
| |
| ---価格------50000
|
--製品B----製品名----B
|
---価格------70000
HTMLもソースコード自体はタグの入れ子(ネスト)になっているので、同じような構造になっているように一見見えるが、あくまでそれはWebページの表示を表す階層構造であって、データの階層構造を表してはいない。
HTMLが「データの」階層構造を表していない例
<ul>
<li>りんご</li>
<li>みかん</li>
</ul>
※最初の<ul>は
| りんご |
|---|
| みかん |
みたいな表を表示するためのもので、データ構造が以下のようになっているわけではない(※あくまでデータの構造はフラットな構造)
ul----li----りんご
|
--li----みかん
(2)タグを検索キーとして目的のデータを取り出すことができる
以下のようにXPath等を利用
(3)テキストデータで記述できる ⇒ 特定のアプリケーションやOSに依存しないため、長期間の保存に対応できたり、異機種間システム連携のデータフォーマットとして利用できる
HTMLはWebブラウザでの表示が目的である
(4)XMLの規格では伝送プロトコルを定めていない ⇒ XML文書をネットワークを介して送受信したい場合、HTTPやSMTPなどを利用して送受信できる
(5)文法がHTMLより厳しい ⇒ エラーがあると処理が停止する
(A)タグは必ず正しく閉じる必要がある( ⇔ HTMLは省略OKな場合あり)
要素の内容として、子要素またはテキストノード(※)を持たない要素 (空要素) は以下のように 終了タグを省略できる(※注:省略する場合は、開始タグの最後の「>」の直前に「/」を記述)
※テキストノード:タグ内の文字データ(文字列)すべて(見た目上、数値も含む)
<style page="350" size="B5" />
(B)タグの入れ子構造が完全に綺麗な形になっている必要がある( ⇔ HTMLはブラウザがある程度補正してくれる)
サンプル
<!-- これが正しい -->
<b><i>テキスト</i></b>
<!-- これはNG -->
<b><i>テキスト</b></i>
(C)属性値は必ずクヴォートで囲む(できればダブルクヴォートの方が好ましい)
サンプル
<!-- これは正しい -->
<note id="1">
<!-- これはアウト -->
<note id=1>
HTMLの属性と異なり、XMLは属性値もDTD(Document Type Definition:文書型定義)、XML Schema(XMLスキーマ)などで定義して自由に決められる
(D)タグの要素名の大文字小文字、属性名の大文字・小文字は区別する
<!-- XML -->
<Note> と <note> は別物
属性名には要素名と同じ名前を指定できる
(E)ルート要素(文書のツリー構造で最も上位に位置する要素)が必ず1つ必要
サンプル
<!-- これは大丈夫 -->
<root>
<a>〇〇<a/>
<b>△△<b/>
</root>
<!-- これはアウト -->
<a/>
<b/>
XML文書の基本構造例
<?xml version="XML規格のバージョン" encoding="文字エンコーディング名" standalone="外部サブセット参照の有無" ?>
<!-- 👆XML宣言 省略可-->
<!-- このファイルがXML文書であることの宣言文 ※以下のものを指定-->
<!-- 👇DOCTYPE宣言(文書型宣言):このXML文書の諸々のルールを定義する 省略可-->
<!-- 読み込むDTD(Document Type Definition:文書型定義(このXMLの構造を定義したルール))
を内部に記述したり、外部から読み込むDTDのパスを書く部分 -->
<!DOCTYPE ルート要素名 SYSTEM "外部サブセット(~.dtd)の相対パス(URI)" [
内部サブセット(=直書きしたDTD)
]>
<!-- ※DOCTYPE宣言を書く場合、XML Schemaは通例書かない -->
<!-- XML Schema:DOCTYPE宣言の代わりに、このXML文書の諸々のルールを定義する-->
<!-- ※XML Schemaを読み込む場合、上記のDOCTYPE宣言は通例書かない-->
<!-- XMLインスタンス:このXML文書本体のこと、実際のXMLデータを記述 必須!!-->
<ルート要素名 xmlns:xsi="名前空間の識別子(見た目がURLみたいなやつ)"
xsi:noNamespaceSchemaLocation="〇〇〇.xsd">
<!-- 「xsi:noNamespaceSchemaLocation="~"」で名前空間なしのXMLに対してスキーマを指定-->
<!-- XMLスキーマを読み込まない場合はルート要素の後ろのxmlns~は不要-->
<子要素>
これはサンプルです
<!--コメント内に「<」「>」は書いてもエラーにならない-->
</子要素>
</ルート要素名>
encoding、standaloneは省略可。encoding="〇〇"を省略した場合「UTF-8」か「UTF-16」で記述されているものと見なされる(パーサーが自動判別)
「外部サブセット」とは
XML文書のルール(DTD) を外部ファイル〇〇〇.dtdとして別に定義するもの
外部ファイルを参照する場合はstandaloneで「no」を指定する。
(※省略すると「no」が設定される)
コメントはXML宣言の前とタグの中には書けない。また、コメント内容の中に「--」は書けない。「<」「>」は書いても大丈夫
参考資料
①XMLマスター教科書 ベーシックV2 森田 浩美・中原 敬子 (著)
②W3Cスクール XMLチュートリアル
https://www.w3schools.com/xml/default.asp
③国土交通省のXMLに関するサイトの1つ
https://www.mlit.go.jp/plateaudocument01-04/1.html
④わわわIT用語辞典 XML Schema
https://wa3.i-3-i.info/word13461.html