XMLとは
XML(Extensible Markup Language/エクステンシブル・マークアップ・ランゲージ/エックスエムエル)は、開始タグと終了タグで階層構造を表し、独自の要素名を定義できるテキストデータ形式です。
文書、設定、Office文書の内部、SVG、各種交換形式などの基盤に使われます。HTMLのように決められた表示要素を並べるのではなく、用途ごとの語彙と構造を定義できます。
XMLはタグ名の意味を自動で理解しません。構文を正しく木構造へする役割と、どの要素を許し何を意味するかを定めるスキーマの役割は別です。

XML文書を作る主な部品
開始タグ、内容、終了タグからなり、子要素を入れ子にできます。
開始タグへ名前と値を付けます。同じ要素に同名属性を重複できません。
要素内の本文です。<や&はエスケープが必要です。
コメント、処理命令(processing instruction)などがありますが、利用可否は上位仕様に従います。
文書要素は一つだけ
<library>
<book id="b1">
<title>ネットワーク入門</title>
</book>
</library>
文書全体を包むdocument element(ドキュメント・エレメント/文書要素)、通称ルート要素は一つです。複数の最上位要素を並べる場合は、それらを包む一つのルートが必要です。
要素名は大小文字を区別します。開始タグと終了タグの名前を一致させ、入れ子を交差させません。空要素は<item/>の形でも表せます。
well-formedと有効は別の判定
well-formed(ウェルフォームド/整形式)は、一つのルート、正しい入れ子、引用符付き属性、禁止文字がないことなど、XMLの基本構文を満たす状態です。違反した文書をXMLプロセッサーは通常の木構造として読み続けません。
valid(バリッド/妥当)は、整形式に加えてDTDやXML Schemaなどのスキーマが定めた要素順、必須項目、型、値域を満たす状態です。スキーマを使わないXMLは、整形式でも「スキーマに対して有効」という判定対象がありません。
名前空間で語彙の衝突を避ける
XML Namespaces(エックスエムエル・ネームスペーシズ/名前空間)は、URIとローカル名前の組で要素・属性名を識別します。異なる仕様がどちらもtitleという名前を使っても、名前空間URIが違えば区別できます。
プレフィックスは文書内の省略名であり、名前そのものではありません。a:titleとb:titleが同じ名前空間URIへ結び付けられていれば、同じexpanded name(エクスパンデッド・ネーム/展開名)です。比較や署名でプレフィックス文字列だけを見てはいけません。
属性と子要素の選び方
短い識別情報を属性、繰り返しや階層を持つ内容を子要素へする設計がよくありますが、XML標準が一律の正解を決めているわけではありません。スキーマ、順序、将来拡張を考えて語彙側で統一します。
属性値は順序を持たず、同じ名前を繰り返せません。子要素は順序と複数出現を表せます。利用側が順序を意味として扱うかもスキーマで定めます。
空白と混在コンテンツ
要素の間の改行や字下げも、XML解析器から見れば文字データになり得ます。データ中心のXMLでは空白だけのテキストノードを無視する処理がありますが、文書中心のmixed content(ミックスド・コンテント/混在内容)では語句間の空白が意味を持ちます。
xml:spaceや上位仕様、スキーマのコンテンツモデルを確認し、「読みやすく整形しただけ」と無条件に空白を削除しません。
エンティティーとXXE
XMLにはentity reference(エンティティー・リファレンス/実体参照)があり、定義済みの<などで特別な文字を表せます。パーサーの設定によっては、DTDから外部資源を参照できる場合もあります。
信頼できないXMLで外部エンティティーを許すと、サーバー内ファイルの読み取り、内部ネットワークへの要求、資源の大量消費を招くXXE(XML External Entity/エックスエムエル・エクスターナル・エンティティ)攻撃につながります。外部DTD・外部エンティティー・ネットワークアクセスを無効にした安全なパーサー設定を使い、入力サイズと展開量も制限します。
文字エンコーディング宣言
XMLはUnicode文字を扱い、外部の実体ではUTF-8とUTF-16を必ず扱えることが基本です。先頭のXML declarationでencoding="UTF-8"などを示せます。HTTPで運ぶ場合はMIMEタイプと文字集合の規則も関わります。
宣言と実際のバイトが違えば致命的なエラーになります。文字化けした状態を推測して読み続けず、生成側で宣言と保存を一致させます。
XMLは一つのルートから要素を正しく入れ子にするテキスト形式です。整形式とスキーマ妥当性、ローカル名と名前空間、本文中の空白と整形用の空白、内部エンティティーと外部エンティティーを分けて扱います。
XML 1.0の構文・整形式・妥当性・encoding:W3C Extensible Markup Language 1.0/名前空間:Namespaces in XML