-
Notifications
You must be signed in to change notification settings - Fork 0
MS_XML
- 戻る(その他、開発の色々(
MS_MiscDevelopmentTopics.md)、WebAPI)
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 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 文書
- 「形式が整えられている」が「整形された式」ではない
- 具体的に言うと、DTD に関する情報を記述しないもの
-
妥当な XML 文書
DTD を明示して構文の検証を行う XML 文書
-
名前空間は URI として記述する。
- URL として記述する方式:
xmlns="http://www.w3.org/2001/XMLSchema" - URN として記述する方式:
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
- URL として記述する方式:
-
名前空間の使用方法
- 要素に前述の
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 で検索する際に「文書に書かれている接頭辞」を そのまま使ってはならないのはこのためである。
-
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が残っていることがあるので確認すること。
-
DTD の後継
- XML Schema 自体が XML により記述される仕様となっている
- データ型や XML 名前空間の定義が扱える
-
問題点
複数の業界有力企業が仕様の策定に参加して、
各社の思惑が絡み合い、あまりに多くの機能を取り込んだ為、
標準化は難航し、複雑な仕様となってしまっている。
外部のファイルを参照を処理しなくても、
すべて正しい文書が得られる XML 文書を示す。
XML をストリーム(StreamReader、StreamWriter)で
シーケンシャルに読み書きする抽象クラス。
-
XmlWriter
-
XmlTextWriter(具象クラス)
StringWriterなどからXmlTextWriterを生成して、
要素属性をシーケンシャルに書込んでいく。
-
-
XmlReader
-
XmlTextReader(具象クラス)
StringReaderなどからXmlTextReaderを生成して、
要素属性をシーケンシャルに読込んでいく。 -
XmlValidatingReader(具象クラス)- 互換性のために残されているメンバー(obsoleted)
- スキーマ検証機能が追加されている。
- たとえば、実体参照を解決しながら進むことが出来る。
-
XmlReaderSettings
XmlValidatingReaderは古く、新しいバージョンでは
XmlReader.Createの引数にXmlReaderSettingsを指定
することで検証機能付きの読込処理を実装できる。
-
DOM による読み書きを行うクラスライブラリ。
-
読み書き
- 読み書きが可能。
- 読み書きに加えて、更新も可能。
-
検索機能として、以下を使用可能。
- DOM —
GetElementById,GetElementsByTagName - XPath —
SelectNodes,SelectSingleNode
- DOM —
※ DTD の ATTLIST で id 属性が ID 型であることを
明示しないと GetElementById が使えないなどの問題がある。
XPath データ モデルを使用し、
XML の読み取り専用で高速なインメモリ表現を提供。
-
署名:
SignedXmlを使用する。 -
暗号化:
EncryptedXmlを使用する。
いずれも SAMLなどで使用される (XML署名の構文と処理 - W3C、 XML暗号化の構文と処理 - W3C)。
補足: XML 署名は「署名対象を参照で指定する」仕組みであるため、 署名検証が通っても署名された範囲が意図どおりとは限らない。 これを突くのが XML Signature Wrapping (XSW) 攻撃で、 SAML の実装脆弱性として繰り返し報告されている。 自前で検証ロジックを書かず、実績のあるライブラリを使うこと。
補足(最新化): 現在の .NET では、 DOM(
XmlDocument)よりも LINQ to XML(XDocument/XElement) が 扱いやすい。オブジェクトとの相互変換にはXmlSerializerやDataContractSerializerを使う。
MSXML2.DOMDocument、MSXML2.DOMDocument60 と言う COM(MS_COM.md)を使用する。
- ASP.NET Web Service(SOAP Web サービス)
- WebAPI
- JSON
- SOAP
- Extensible Markup Language - Wikipedia
- XML ドキュメントと XML データ - Microsoft Learn
- Extensible Markup Language (XML) - W3C
- 連載:.NETで簡単XML - @IT
Tags: IT国際標準, プログラミング, 通信技術, .NET開発, ASP.NET
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。