Skip to content
nishi_74322014 edited this page Aug 3, 2026 · 1 revision

XML

概要

XML(Extensible Markup Language)、JIS による訳語「拡張可能なマーク付け言語」とは、

  • 基本的な構文規則を共通とすることで、
    任意の用途向けの言語に拡張することを容易としたことが特徴のマークアップ言語の総称。

  • SGML からの移行を目的として SGML のサブセットに定められ開発された。

    • 文法は SGML の構文解析器と互換性を保つようにシンプルに
    • 機能は SGML に無いものが追加されている。
  • 仕様は、World Wide Web Consortium (W3C) により策定・勧告。

    • 1998 年 2 月に XML 1.0 が勧告された。
    • XML 1.0 と XML 1.1 の 2 つのバージョンが勧告されている。

補足: XML 1.1 は制御文字と改行の扱いを拡張したものだが、 ほとんど普及しなかった。実務で XML と言えば **XML 1.0(第 5 版)**である。

詳細

XML宣言

  • XML 文書の先頭に付き、その文書が XML 文書であることを明確に示す文字列。

  • XML 宣言の例

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
属性 内容
version 内容は常に 1.0。また XML 宣言中で省略はできない
encoding XML 文書がどのような文字コードで記述されているかを明示する
standalone XML 文書がスタンドアロン文書かどうかを、yes または no で記述する

検索方法

方法 内容
DOM Document Object Model。XML 文書を各種プログラムから利用するための仕組み
XPath ロケーションパスにより XML に準拠した文書の特定の部分を指定する言語構文
XSLT XSL Transformations(XSL 変換)。XPath による選択と検索にもとづき、XML 文書全体または一部に対して変換を行い出力できる

XSLT の出力先は次のとおり。

  • XML 形式
  • XML(整形式)ではないその他任意のテキスト形式

スキーマ

XML 用のスキーマ言語には、

  • DTD
  • XML Schema
  • RELAX
  • XML Data Reduced

などがある。

整形式の / 妥当なXML文書

  • 整形式の XML 文書

    • 表面的な形式だけが整えられた XML 文書
    • 「形式が整えられている」が「整形された式」ではない
    • 具体的に言うと、DTD に関する情報を記述しないもの
  • 妥当な XML 文書
    DTD を明示して構文の検証を行う XML 文書

名前空間

  • 名前空間は URI として記述する。

    • URL として記述する方式: xmlns="http://www.w3.org/2001/XMLSchema"
    • URN として記述する方式: xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  • 名前空間の使用方法

    • 要素に前述の xmlns 属性を記述し、適用される名前空間を指定できる。
    • なお、要素名に指定した場合
      • 子要素に伝播する。
      • が、属性には伝播しない
  • 名前空間の接頭辞

    • しかし、上記では長すぎるので、以下の様に短縮系の接頭辞を定義できる。

      xmlns:接頭辞="名前空間"
      
    • これを「接頭辞:要素名や属性名」のようにして要素や属性の名前空間を指定できる。

    • この場合、接頭辞を使用することで属性にも名前空間を明記し易い。

      • xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
      • xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

補足: 名前空間 URI は単なる識別子であって、 そこに実体があるとは限らない(アクセスしに行くものではない)。 また、接頭辞そのものには意味が無い。 意味を持つのは接頭辞が束縛された URI の方であり、 接頭辞は文書ごとに自由に付け替えられる。 XPath で検索する際に「文書に書かれている接頭辞」を そのまま使ってはならないのはこのためである。

DTD

  • Document Type Definition(文書型定義、DTD)

  • XML において、文書構造(文書型)を定義するためのスキーマ言語

  • 問題点(もともと SGML は文書処理を目的とした言語)

    • DTD は独自の構文を持っていて、XML の要素や属性とは別の記述方法が必要。
    • データ型の種類が極めて少ない。
    • 名前空間に対応する機能を持っていない。
    • ある名前の要素が内容モデルを 1 つしか持てない。

補足(セキュリティ): DTD は機能面だけでなくセキュリティ上も問題がある。

  • XXE(XML External Entity): 外部実体参照により サーバ上のファイル読み出しや SSRF が可能になる。
  • XML 爆弾(Billion Laughs): 実体参照の入れ子で 展開後のサイズを爆発させ、DoS を引き起こす。

対策は「DTD の処理を無効にする」ことである。 .NET では次のようにする。

var settings = new XmlReaderSettings
{
    DtdProcessing = DtdProcessing.Prohibit,
    XmlResolver  = null
};

.NET Framework 4.5.2 以降および .NET Core では既定で無効だが、 古いコードでは DtdProcessing.Parse が残っていることがあるので確認すること。

XML Schema

  • DTD の後継

    • XML Schema 自体が XML により記述される仕様となっている
    • データ型や XML 名前空間の定義が扱える
  • 問題点
    複数の業界有力企業が仕様の策定に参加して、
    各社の思惑が絡み合い、あまりに多くの機能を取り込んだ為、
    標準化は難航し、複雑な仕様となってしまっている。

スタンドアロン文書(非依存文書)

外部のファイルを参照を処理しなくても、
すべて正しい文書が得られる XML 文書を示す。

クラスライブラリ

.NET

XmlReader / XmlWriter

XML をストリーム(StreamReaderStreamWriter)で
シーケンシャルに読み書きする抽象クラス。

  • XmlWriter

    • XmlTextWriter(具象クラス)
      StringWriter などから XmlTextWriter を生成して、
      要素属性をシーケンシャルに書込んでいく。
  • XmlReader

    • XmlTextReader(具象クラス)
      StringReader などから XmlTextReader を生成して、
      要素属性をシーケンシャルに読込んでいく。
    • XmlValidatingReader(具象クラス)
      • 互換性のために残されているメンバー(obsoleted)
      • スキーマ検証機能が追加されている。
      • たとえば、実体参照を解決しながら進むことが出来る。
    • XmlReaderSettings
      XmlValidatingReader は古く、新しいバージョンでは
      XmlReader.Create の引数に XmlReaderSettings を指定
      することで検証機能付きの読込処理を実装できる。

XmlDocument

DOM による読み書きを行うクラスライブラリ。

  • 読み書き

    • 読み書きが可能。
    • 読み書きに加えて、更新も可能。
  • 検索機能として、以下を使用可能。

    • DOM — GetElementById, GetElementsByTagName
    • XPath — SelectNodes, SelectSingleNode

※ DTD の ATTLIST で id 属性が ID 型であることを
 明示しないと GetElementById が使えないなどの問題がある。

XPathDocument

XPath データ モデルを使用し、
XML の読み取り専用で高速なインメモリ表現を提供。

SignedXml / EncryptedXml

  • 署名: SignedXml を使用する。
  • 暗号化: EncryptedXml を使用する。

いずれも SAMLなどで使用される (XML署名の構文と処理 - W3CXML暗号化の構文と処理 - W3C)。

補足: XML 署名は「署名対象を参照で指定する」仕組みであるため、 署名検証が通っても署名された範囲が意図どおりとは限らない。 これを突くのが XML Signature Wrapping (XSW) 攻撃で、 SAML の実装脆弱性として繰り返し報告されている。 自前で検証ロジックを書かず、実績のあるライブラリを使うこと。

補足(最新化): 現在の .NET では、 DOM(XmlDocument)よりも LINQ to XML(XDocument / XElement が 扱いやすい。オブジェクトとの相互変換には XmlSerializerDataContractSerializer を使う。

VBA

MSXML2.DOMDocumentMSXML2.DOMDocument60 と言う COM(MS_COM.md)を使用する。

関連情報

WebAPI

方式

作成方法

参考


Tags: IT国際標準, プログラミング, 通信技術, .NET開発, ASP.NET

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally