概要

この仕様は、Web アプリケーションが DOM ノードの構文解析と直列化で使用するための、 HTML および汎用 XML パーサーへのプログラム的アクセスのための さまざまな API を定義する。

この文書の ステータス

この節は、公開時点におけるこの文書のステータスを説明する。他の文書が この文書に取って代わる可能性がある。現在の W3C 公開物の一覧とこの技術報告の最新改訂は、http://www.w3.org/TR/ にある W3C 技術報告 インデックスで見つけることができる。

この仕様は、 DOM の構文解析と直列化 Living Specification の元の作業に基づくが、 サポートされる機能、規範的要件、およびアルゴリズムの具体性の点で分岐している。 適切な場合には、Living Specification からの関連する修正がこの文書に取り込まれる。

この文書は、Web Platform Working Group により Working Draft として公開された。 この文書は W3C 勧告となることを意図している。 この文書に関するコメントを行いたい場合は、 www-dom@w3.org購読アーカイブ) 宛てに、メールの件名の先頭に DOM-Parsing を付けて送ってほしい。 すべてのコメントを歓迎する。

Working Draft としての公開は、W3C 会員による承認を意味しない。これは草案文書であり、いつでも他の文書により 更新、置換、または廃止される可能性がある。この文書を進行中の作業以外として 引用することは不適切である。

この文書は、 2004年2月5日付 W3C 特許 ポリシーの下で運営される グループにより作成された。 W3C は、そのグループの成果物に関連して行われた 特許開示の公開一覧 を維持している。そのページには、 特許を開示するための手順も含まれている。ある個人が、その個人の考えでは 必須 クレームを含む特許について実際の知識を有する場合、その個人は W3C 特許ポリシーの 6 節に従って情報を開示しなければならない。

この文書は、2015年9月1日付 W3C プロセス文書により管理される。

候補勧告の 終了基準

この仕様は、仕様の テストスイートが完了し、2 つ以上の 独立した実装が各テストに合格するまでは、勧告案へ進まない。ただし、単一の実装が 各テストに合格しなければならないわけではない。この基準を満たすのは、早くても 2014 年 10 月 24 日以降になると予想している。 このグループは 実装報告も作成する。

1. 適合性

非規範的として印付けされた節に加え、この仕様におけるすべての作成指針、図、 例、および注記は非規範的である。この仕様におけるそれ以外のものはすべて 規範的である。

アルゴリズムの一部として命令形で表現された要件 (たとえば「先頭の空白文字をすべて取り除く」または「false を返し、 これらの手順を終了する」など)は、そのアルゴリズムを導入する際に使用された キーワード(「しなければならない」「すべきである」「してもよい」など)の 意味で解釈される。

アルゴリズムまたは特定の手順として表現された適合性要件は、 最終結果が同等である限り、どのような方法で実装してもよい。 (特に、この仕様で定義されるアルゴリズムは、従いやすいことを意図しており、 高性能であることを意図していない。)

ユーザーエージェントは、 そうでなければ制約のない入力に対して、実装固有の制限を課してもよい。 たとえば、サービス拒否攻撃を防止するため、メモリ不足を防ぐため、 またはプラットフォーム固有の制限を回避するためである。

あるメソッドまたは属性が別のメソッドまたは属性を呼び出すと言われる場合、 ユーザーエージェントは、その属性またはメソッドに対する内部 API を呼び出さなければならない。 これにより、たとえば作者が ECMAScript で属性またはメソッドをカスタムプロパティや関数で 上書きすることによって、その動作を変更できないようにする。

別途述べられていない限り、文字列比較は 大文字小文字を区別する方法で行われる。

あるアルゴリズムが別のアルゴリズムを呼び出す場合、後者によって投げられた 例外は(明示的に捕捉されない限り)、前者を終了させ、その例外を その呼び出し元へ伝播させなければならない。

1.1 依存関係

この仕様における IDL 断片は、Web IDL 仕様で説明される、適合する IDL 断片に要求されるものとして 解釈されなければならない。 [WEBIDL]

この仕様で使用される用語の一部は、 [DOM4]、[HTML5]、および [XML10] で定義されている。

1.2 拡張性

この仕様に対するベンダー固有の独自拡張は 強く推奨されない。作者はそのような拡張を使用してはならない。 それを行うと相互運用性が低下し、ユーザーベースが分断され、 特定のユーザーエージェントのユーザーだけが対象のコンテンツに アクセスできるようになるためである。

ベンダー固有の拡張が必要な場合、そのメンバーには、 この仕様の将来のバージョンとの衝突を防ぐため、 ベンダー固有の文字列を接頭辞として付けるべきである。 拡張は、その拡張の使用が、この仕様で定義される機能と矛盾せず、 またはその機能を非適合にしないように定義されなければならない。

この仕様に対するベンダー中立の拡張が必要な場合、 この仕様をそれに応じて更新するか、 この仕様の要件を上書きする拡張仕様を書くことができる。 この仕様を自らの活動に適用する誰かが、そのような拡張仕様の要件を 認識することを決定した場合、それはこの仕様における適合性要件の目的において 適用可能な 仕様となる。

2. 用語

コンテキストオブジェクトという用語は、 論じられているメソッドまたは属性が呼び出された対象のオブジェクトを意味する。

3. 名前空間

HTML 名前空間http://www.w3.org/1999/xhtml である。

XML 名前空間http://www.w3.org/XML/1998/namespace である。

XMLNS 名前空間http://www.w3.org/2000/xmlns/ である。

4. Node の構文解析と直列化

4.1 構文解析

次の手順は フラグメント 構文解析アルゴリズムを構成し、その 引数は markup 文字列および context element である。

  1. context elementノード文書HTML 文書である場合: algorithmHTML フラグメント構文解析アルゴリズムとする。

    context elementノード文書XML 文書である場合: algorithmXML フラグメント構文解析アルゴリズムとする。

  2. new children を、markupinput とし、context elementcontext 要素として、algorithm を呼び出した結果とする。
  3. fragment を、新しい DocumentFragment とし、その ノード文書context elementノード文書である。
  4. new children 内の各 ノードfragment に (木順序で) 追加する
    注記

    これにより、新しい ノードノード文書 が正しいことが保証される。

  5. fragment の値を返す。

4.2 直列化

次の手順は フラグメント直列化アルゴリズムを構成し、 その引数は Node node およびフラグ 整形式を要求するである:

  1. context documentnodeノード文書の値とする。
  2. context documentHTML 文書である場合、 nodeHTML 直列化を返す。
  3. そうでない場合、context documentXML 文書である; フラグ require well-formed を渡して、 nodeXML 直列化を返す。
    注記

    この文書で定義される XML 直列化は、[HTML5] で定義される XML フラグメント 直列化アルゴリズムの要件に適合する。

Node nodeHTML 直列化を生成するには、ユーザーエージェントは node に対して HTML フラグメント直列化アルゴリズム [HTML5] を実行し、 生成された文字列を返さなければならない。

Node nodeXML 直列化を、フラグ require well-formed が与えられたものとして生成するには、 次の手順を実行する:

  1. コンテキスト名前空間null とする。 コンテキスト名前空間は、ある node がその親とは異なる既定の名前空間定義を直列化するときに変更される。 このアルゴリズムは、開始時点では名前空間がないものと仮定する。
  2. 名前空間接頭辞マップを、namespaceURI と名前空間 prefix の組を関連付けるための新しいマップとする。ここで namespaceURI 値はマップのキーであり、prefix 値は マップのキー値である。名前空間接頭辞 マップには、サブツリーについて以前に見られた namespaceURI とその最新の接頭辞の関連付けが 設定される。注記: 名前空間接頭辞マップは、与えられた namespaceURI に対して 単一の接頭辞値だけを関連付ける。直列化の間に、同じ namespaceURI に対応する異なる名前空間接頭辞が 見つかった場合、最後に遭遇したものが、新しい接頭辞値でマップ内の既存のキー値を置き換えることにより 「勝つ」。
  3. 名前空間接頭辞マップを、 XML 名前空間キー と、キー値としての文字列 "xml" で初期化する。
  4. 生成された名前空間接頭辞インデックスを、 値 1 の整数とする。生成された名前空間 接頭辞インデックスは、node の namespaceURI(または node の いずれかの属性の namespaceURI)を直列化するために利用可能な適切な既存の名前空間接頭辞がない場合に、 新しい一意の接頭辞値を生成するために使用される。 接頭辞を生成するアルゴリズムを参照。
  5. node に対して XML 直列化 アルゴリズムを実行し、コンテキスト 名前空間名前空間接頭辞 マップ生成された名前空間接頭辞インデックス参照、および フラグ require well-formed を渡した結果を返す。アルゴリズムの実行中に 例外が 発生した場合、その例外を捕捉し、 name が "InvalidStateError" である DOMException を投げる。

XML 直列化は、 HTML 直列化と次の点で異なる:

それ以外では、XML 直列化を 生成するアルゴリズムは、 HTML パーサーと互換性のある直列化を生成するように設計されている。 たとえば、子ノードを含まない HTML 名前空間内の要素は、自己終了タグ構文を使用するのではなく、明示的な開始タグと終了タグで 直列化される [XML10]。

注記

[DOM4] によれば、 Attr オブジェクトは Node から継承しないため、 XML 直列化アルゴリズムによって直列化することはできない。 Attr オブジェクトを直列化しようとすると、TypeError 例外が発生する [WEBIDL]。

コンテキスト名前空間 namespace名前空間接頭辞 マップ prefix map生成された名前空間接頭辞 インデックス prefix index、およびフラグ require well-formed が与えられた node に対して XML 直列化アルゴリズムを実行するには、 ユーザーエージェントは node のインターフェイスに応じて適切な手順を実行しなければならない:

Element

次のアルゴリズムを実行する:

  1. require well-formed フラグが設定されており(その値が true)、かつこの nodelocalName 属性が文字 ":"(U+003A COLON)を含むか、XML Name 生成規則 [XML10] に一致しない場合、 例外を 投げる; この node の直列化は整形式の要素にならない。
  2. markup を文字列 "<"(U+003C LESS-THAN SIGN)とする。
  3. qualified name を空文字列とする。
  4. skip end tag フラグに値 false を持たせる。
  5. ignore namespace definition attribute フラグに値 false を持たせる。
  6. mapprefix map のコピーとする。
  7. element prefixes list を空リストとする。このリストは 各要素にローカルである。その目的は、新しい名前空間接頭辞属性を生成する必要がある場合に、 競合する接頭辞が存在しないことを保証することである。
  8. duplicate prefix definitionnull とする。
  9. local default namespace を、mapelement prefixes list、および duplicate prefix definition が与えられた node について 名前空間情報を記録する結果とする。
    注記

    上記の手順は、見つかった任意の名前空間接頭辞定義で map を更新し、 見つかった接頭辞定義を element prefixes list に追加し、必要に応じて duplicate prefix definition 値を設定し、既定の名前空間属性で定義された ローカル既定名前空間値が存在する場合はそれを返す。そうでなければ null を返す。

  10. inherited nsnamespace のコピーとする。
  11. nsnodenamespaceURI 属性の値とする。
  12. inherited nsns と等しい場合:
    1. local default namespacenull でない場合、 ignore namespace definition attributetrue に設定する。
    2. nsXML 名前空間である場合、 qualified name を、文字列 "xml:" と nodelocalName の値の連結とする。
    3. そうでない場合、qualified namenodelocalName の値とする。 node の接頭辞は常に削除される。
    4. qualified name の値を markup に付加する。
  13. そうでない場合、inherited nsns と等しくない (node 自身の名前空間は、その親のコンテキスト名前空間と異なる)。 次の下位手順を実行する:
    1. prefixnodeprefix 属性の値とする。
    2. candidate prefix を、ns の値に一致するキーが map 内に存在する場合は map から得られる値とし、 そのようなキーが存在しない場合は candidate prefixnull とする。
    3. candidate prefixnull でない場合(ns に 対応する適切な名前空間接頭辞が定義されている場合):
      1. qualified name を、candidate prefix、 ":"(U+003A COLON)、および node localName の連結とする。 この node または node の祖先上に、 node の名前空間を定義する名前空間接頭辞定義が存在する。
      2. local default namespacenull でない場合 (ローカルに定義された既定の名前空間宣言属性が存在する場合)、 inherited nsns の値を取得させる。
      3. qualified name の値を markup に付加する。
    4. そうでなく、prefixnull でなく、かつ local default namespacenull である場合:
      1. element prefixes listprefix の値を含む場合、 prefix を、 接頭辞を生成する結果とする。 入力として、 名前空間接頭辞マップ mapnodens 文字列、および prefix index 整数を与える。
      2. そうでない場合、map に新しいキー ns を追加し、 そのキー値を prefix とする。
      3. qualified name を、 prefix、":"(U+003A COLON)、および nodelocalName の連結とする。
      4. qualified name の値を markup に付加する。
      5. 次のものを、列挙された順に markup に付加する: 次は、 いま map に追加された新しい名前空間/接頭辞の関連付けを 直列化する。
        1. " "(U+0020 SPACE);
        2. 文字列 "xmlns:";
        3. prefix の値;
        4. "=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
        5. ns および require well-formed フラグを 入力として与えた 属性値を直列化する 結果;
        6. """(U+0022 QUOTATION MARK)。
    5. そうでなく、local default namespacenull であるか、 または local default namespacenull でなく、その値が ns と等しくない場合:
      1. ignore namespace definition attribute フラグを true に設定する。
      2. qualified namenodelocalName の値とする。
      3. inherited ns の値を ns とする。新しい既定の名前空間は、直列化においてこの node の名前空間を定義し、その の コンテキスト名前空間として機能するために使用される。
      4. qualified name の値を markup に付加する。
      5. 次のものを、列挙された順に markup に付加する: 次は、新しい(または置換の)既定の名前空間定義を直列化する。
        1. " "(U+0020 SPACE);
        2. 文字列 "xmlns";
        3. "=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
        4. ns および require well-formed フラグを 入力として与えた 属性値を直列化する 結果;
        5. """(U+0022 QUOTATION MARK)。
    6. そうでない場合、nodens と一致する local default namespace を持つ。qualified namenodelocalName の値とし、 inherited ns の値を ns とし、 qualified name の値を markup に付加する。
  14. map という 名前空間接頭辞マップprefix index という 生成された接頭辞インデックス、 フラグ ignore namespace definition attribute および duplicate prefix definition の値が与えられた node の属性の XML 直列化の結果を markup に付加する。
  15. nsHTML 名前空間であり、 node のリストが空であり、かつ nodelocalName が次の void 要素のいずれかに一致する場合: "area", "base", "basefont", "bgsound", "br", "col", "embed", "frame", "hr", "img", "input", "keygen", "link", "menuitem", "meta", "param", "source", "track", "wbr"; その場合、次のものを、列挙された順に markup に付加する:
    1. " "(U+0020 SPACE);
    2. "/"(U+002F SOLIDUS)。
    そして skip end tag フラグを true に設定する。
  16. nsHTML 名前空間でなく、 node のリストが空である場合、"/"(U+002F SOLIDUS)を markup に付加し、 skip end tag フラグを true に設定する。
  17. ">"(U+003E GREATER-THAN SIGN)を markup に付加する。
  18. skip end tag の値が true である場合、 markup の値を返し、残りの手順を飛ばす。 node は葉ノードである。
  19. nsHTML 名前空間であり、かつ nodelocalName が文字列 "template" に一致する場合、これは template 要素である。 template 要素の template contentsDocumentFragment) に対して XML 直列化アルゴリズムを実行した結果を markup に付加する。このとき、 コンテキスト名前空間には inherited ns の値を、 名前空間 接頭辞マップには map を、 生成された名前空間接頭辞インデックスには prefix index を、そして require well-formed フラグの値を 与える。これにより、[HTML5] の XHTML 文書の構文解析の 規則が与えられたとき、 template content を 往復変換できる。
  20. そうでない場合、node の各 に対して、 木順序XML 直列化アルゴリズムを実行した結果を markup に付加する。このとき、 コンテキスト名前空間には inherited ns の値を、 名前空間 接頭辞マップには map を、 生成された名前空間接頭辞インデックスには prefix index を、そして require well-formed フラグの値を与える。
  21. 次のものを、列挙された順に markup に付加する:
    1. "</"(U+003C LESS-THAN SIGN, U+002F SOLIDUS);
    2. qualified name の値;
    3. ">"(U+003E GREATER-THAN SIGN)。
  22. markup の値を返す。
Document

require well-formed フラグが設定されており(その値が true)、かつこの nodedocumentElement を持たない ( documentElement 属性の値が null である)場合、 例外を 投げる; この node の直列化は整形式の文書にならない。

そうでない場合、次の手順を実行する:

  1. serialized document を空文字列とする。
  2. nodedoctype 属性が null でない場合、require well-formed フラグが与えられた nodedoctype 属性の DocumentType 直列化を生成する手順を実行して 生成された文字列を serialized document に付加する。
  3. node の各 child について、 木順序で、 XML 直列化アルゴリズムchild に対して実行する。このとき、 コンテキスト 名前空間 namespace名前空間 接頭辞マップ prefix map生成された 名前空間接頭辞インデックス prefix index への参照、フラグ require well-formed を与え、 その結果を serialized document に付加する。
  4. serialized document の値を返す。
Comment

require well-formed フラグが設定されており(その値が true)、かつ nodedata が XML Char 生成規則 [XML10] に一致しない文字を含む、 または "--"(隣接する 2 つの U+002D HYPHEN-MINUS 文字)を含む、 または "-"(U+002D HYPHEN-MINUS)文字で終わる場合、 例外を投げる; この nodedata の直列化は整形式にならない。

"<!--"、nodedata、 および "-->" の連結を返す。

Text
  1. require well-formed フラグが設定されており(その値が true)、かつ nodedata が XML Char 生成規則 [XML10] に一致しない文字を含む場合、 例外を投げる; この nodedata の直列化は整形式にならない。
  2. markupnodedata の値とする。
  3. markup 内の "&" の出現をすべて "&amp;" で置換する。
  4. markup 内の "<" の出現をすべて "&lt;" で置換する。
  5. markup 内の ">" の出現をすべて "&gt;" で置換する。
  6. markup の値を返す。
DocumentFragment
  1. markup を空文字列とする。
  2. node の各 child について、 木順序で、 XML 直列化アルゴリズムchild に対して実行する。このとき コンテキスト名前空間 namespace名前空間接頭辞マップ prefix map生成された 名前空間接頭辞インデックス prefix index への参照、およびフラグ require well-formed を与える。 結果を markup に連結する。
  3. markup の値を返す。
DocumentType
require well-formed フラグが与えられた nodeDocumentType 直列化を生成する手順を実行し、それによって生成された文字列を返す。
ProcessingInstruction
  1. require well-formed フラグが設定されており(その値が true)、かつ nodetarget が ":"(U+003A COLON)文字を含む、または文字列 "xml" に ASCII 大文字小文字不区別で一致する場合、 例外を 投げる; この nodetarget の直列化は整形式にならない。
  2. require well-formed フラグが設定されており(その値が true)、かつ nodedata が XML Char 生成規則 [XML10] に一致しない文字を含む、または 文字列 "?>"(U+003F QUESTION MARK, U+003E GREATER-THAN SIGN)を 含む場合、 例外を投げる; この nodedata の直列化は整形式にならない。
  3. markup を、次のものを列挙された順に連結したものとする:
    1. "<?"(U+003C LESS-THAN SIGN, U+003F QUESTION MARK);
    2. nodetarget の値;
    3. " "(U+0020 SPACE);
    4. nodedata の値;
    5. "?>"(U+003F QUESTION MARK, U+003E GREATER-THAN SIGN)。
  4. markup の値を返す。

Node nodeDocumentType 直列化を生成するには、 require well-formed フラグが与えられたものとして、 ユーザーエージェントは次のアルゴリズムの結果を返さなければならない:

  1. require well-formed フラグが true であり、 かつ nodepublicId 属性が XML PubidChar 生成規則 [XML10] に一致しない文字を含む場合、 例外を投げる; この node の直列化は 整形式の文書型宣言にならない。
  2. require well-formed フラグが true であり、 かつ nodesystemId 属性が XML Char 生成規則 [XML10] に一致しない文字を含む、 または """(U+0022 QUOTATION MARK)と "'" (U+0027 APOSTROPHE)の両方を含む場合、例外を 投げる; この node の直列化は整形式の文書型宣言にならない。
  3. markup を空文字列とする。
  4. 文字列 "<!DOCTYPE" を markup に付加する。
  5. " "(U+0020 SPACE)を markup に付加する。
  6. nodename 属性の値を markup に付加する。 HTML 文書 に属する node については、その値はすべて小文字になる。
  7. nodepublicId が空文字列でない場合、次のものを、列挙された順に markup に付加する:
    1. " "(U+0020 SPACE);
    2. 文字列 "PUBLIC";
    3. " "(U+0020 SPACE);
    4. """(U+0022 QUOTATION MARK);
    5. nodepublicId 属性の値;
    6. """(U+0022 QUOTATION MARK)。
  8. nodesystemId が空文字列でなく、かつ nodepublicId が空文字列に設定されている場合、次のものを、列挙された順に markup に付加する:
    1. " "(U+0020 SPACE);
    2. 文字列 "SYSTEM"。
  9. nodesystemId が空文字列でない場合、次のものを、列挙された順に markup に付加する:
    1. " "(U+0020 SPACE);
    2. """(U+0022 QUOTATION MARK);
    3. nodesystemId 属性の値;
    4. """(U+0022 QUOTATION MARK)。
  10. ">"(U+003E GREATER-THAN SIGN)を markup に付加する。
  11. markup の値を返す。

名前空間接頭辞マップ mapelement prefixes list(初期状態では空)、および duplicate prefix definition 参照が与えられた Element element について 名前空間情報を記録するには、ユーザーエージェントは 次の手順を実行しなければならない:

  1. default namespace attr valuenull とする。
  2. Main: elementattributes 内の各 属性 attr について、 element属性リストで指定された順序で:
    注記

    次の条件付き手順は、名前空間接頭辞を element prefixes list に追加し、それらを map に追加または置換する。 XMLNS 名前空間内の属性のみが考慮される (たとえば、 setAttribute("xmlns:pretend-prefix", "pretend-namespace") により名前空間宣言のように見えるように作られた属性は含まれない)。

    1. attribute namespaceattrnamespaceURI 値の値とする。
    2. attribute prefixattrprefix の値とする。
    3. attribute namespaceXMLNS 名前空間である場合:
      1. attribute prefixnull である場合、 attr は既定の名前空間宣言である。 default namespace attr valueattrvalue に設定し、これらの手順の実行を停止して、 Main に戻り、次の属性を訪問する。
      2. そうでない場合、attribute prefixnull でなく、 attr は名前空間接頭辞定義である。次の手順を実行する:
        1. prefix definitionattrlocalName の値とする。
        2. namespace definitionattrvalue の値とする。
        3. namespace definition の値に一致するキーがすでに map 内に存在し、 そのキーの値が prefix definition と一致する場合、 これは重複する名前空間接頭辞定義である。 duplicate prefix definition の値を prefix definition に設定する。
        4. そうでなく、namespace definition の値に一致するキーが すでに map 内に存在するが、そのキーの値が prefix definition と一致しない場合、 そのキーの値を prefix definition となるように更新する。
        5. そうでない場合、namespace definition の値に一致するキーは 存在しない; map に新しいキー namespace definition を追加し、 そのキー値を prefix definition とする。
        6. prefix definition の値を element prefixes list に付加する。
  3. default namespace attr value の値を返す。

名前空間接頭辞マップ map、 文字列 new namespace、および 生成された名前空間接頭辞インデックス prefix index への参照が与えられたときに 接頭辞を 生成するには、ユーザーエージェントは次の手順を実行しなければならない:

  1. generated prefix を、文字列 "ns" と prefix index の現在の数値の連結とする。
  2. prefix index の値を 1 増加させる。
  3. map に新しいキー new namespace を追加し、 そのキー値を generated prefix とする。
  4. generated prefix の値を返す。

名前空間接頭辞 マップ map生成された接頭辞インデックス prefix index 参照、フラグ ignore namespace definition attributeduplicate prefix definition 値、およびフラグ require well-formed とともに 与えられた Element element属性の XML 直列化は、次のアルゴリズムの結果である:

  1. result を空文字列とする。
  2. localname set を新しい空の 名前空間 localname 集合とする。 この localname set は、一意の属性 namespaceURIlocalName の組のタプルを含み、各 attr が処理されるにつれて設定される。 この集合は、要素が同じ namespaceURIlocalName を持つ 2 つの属性を持つことができないという整形式制約を [任意で]強制するために使用される。 これは、同じ要素上の他の点では同一の 2 つの属性が、 その接頭辞値だけで異なる場合に起こり得る。
  3. Main: elementattributes 内の各 属性 attr について、 element属性リストで指定された順序で:
    1. require well-formed フラグが設定されており(その値が true)、かつ localname set が、 attrnamespaceURI 属性と localName 属性からなる新しいタプルの値と一致する値を持つタプルを含む場合、 例外を 投げる; この attr の直列化は整形式の要素直列化を生成できない。
    2. attrnamespaceURI 属性および localName 属性からなる新しいタプルを作成し、それを localname set に追加する。
    3. attribute namespaceattrnamespaceURI 値の値とする。
    4. candidate prefixnull とする。
    5. attribute namespacenull でない場合、次の下位手順を実行する:
      1. attribute namespace の値が XMLNS 名前空間であり、かつ attrprefixnull であって ignore namespace definition attribute フラグが true であるか、または attrprefixnull でなく、かつ attrlocalNameduplicate prefix definition の値に一致する場合、 これらの手順の実行を停止し、 Main に移動して次の属性を訪問する。
      2. そうでなく、attribute namespace の値に一致するキーが map 内に存在する場合、 candidate prefix を、そのキーの map からの値とする。
      3. そうでない場合、attribute namespace に一致するキーは map 内に存在せず、かつ attribute namespaceXMLNS 名前空間 ではない。次の手順を実行する:
        1. candidate prefix を、 mapattribute namespace、および prefix index を 入力として与えた 接頭辞を生成する結果とする。
        2. 次のものを、列挙された順に result に付加する:
          1. " "(U+0020 SPACE);
          2. 文字列 "xmlns:";
          3. candidate prefix の値;
          4. "=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
          5. attribute namespace および require well-formed フラグを 入力として与えた 属性値を直列化する 結果;
          6. """(U+0022 QUOTATION MARK)。
    6. " "(U+0020 SPACE)を result に付加する。
    7. candidate prefixnull でない場合、 candidate prefix と ":"(U+003A COLON)の連結を result に付加する。
    8. require well-formed フラグが設定されており(その値が true)、かつこの attrlocalName 属性が文字 ":"(U+003A COLON)を含む、または XML Name 生成規則 [XML10] に 一致しない、または "xmlns" と等しく、かつ attribute namespacenull である場合、 例外を 投げる; この attr の直列化は整形式の属性にならない。
    9. 次の文字列を、列挙された順に result に付加する:
      1. attrlocalName の値;
      2. "=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
      3. attrvalue 属性および require well-formed フラグを入力として与えた 属性値を直列化する結果;
      4. """(U+0022 QUOTATION MARK)。
  4. result の値を返す。

attribute value および require well-formed フラグが 与えられたときに 属性値を直列化するには、 ユーザーエージェントは次の手順を実行しなければならない:

  1. require well-formed フラグが設定されており(その値が true)、かつ attribute value が XML Char 生成規則 [XML10] に一致しない文字を含む場合、 例外を投げる; この attribute value の直列化は整形式の要素直列化を生成できない。
  2. attribute valuenull である場合、空文字列を返す。
  3. そうでない場合、attribute value は文字列である。次の出現をまず置換した上で、 attribute value の値を返す:
    1. """ を "&quot;" に
    2. "&" を "&amp;" に
    3. "<" を "&lt;" に
    4. ">" を "&gt;" に
    注記

    これはブラウザーに存在する挙動と一致し、XML 仕様の AttValue 生成規則 [XML10] における 文法要件を超えて、">" 文字も置換する。

5. DOMParser インターフェイス

enum SupportedType {
    "text/html",
    "text/xml",
    "application/xml",
    "application/xhtml+xml",
    "image/svg+xml"
};

DOMParser() コンストラクターは、 新しい DOMParser オブジェクトを返さなければならない。

[Constructor]
interface DOMParser {
    [NewObject]
    Document parseFromString (DOMString str, SupportedType type);
};

5.1 メソッド

parseFromString

parseFromString(str, type) メソッドは、type に応じて次の手順を実行しなければならない:

"text/html"

strHTML パーサーで構文解析し、 新しく作成された 文書を返す。

スクリプティングフラグは "disabled" に設定されなければならない。

注記

meta 要素は、使用されるエンコーディングについて考慮されない。 Unicode ストリームがパーサーに渡されるためである。

注記

script 要素は実行不能として印付けされ、 noscript の内容はマークアップとして構文解析される。

"text/xml"
"application/xml"
"application/xhtml+xml"
"image/svg+xml"
  1. str を、名前空間に対応した XML パーサーで構文解析する。
    注記

    XML パーサーを使用して 構文解析されたすべての XHTML script 要素について、 スクリプティングフラグに相当するものは、 "disabled" に設定されなければならない。

  2. 前の手順がエラーを返さなかった場合、新しく作成された 文書を返す。
  3. document を、新しく作成された XML 文書とする。 document は、 XMLDocument インターフェイスではなく、 Document インターフェイスを使用する。
  4. root を、新しい Elementとし、 その ローカル名 を "parsererror" に設定し、その 名前空間 を "http://www.mozilla.org/newlayout/xml/parsererror.xml" に設定する。

    この時点で、ユーザーエージェントは、 たとえばエラーの性質を説明するために、ノードを root追加してもよい。

  5. rootdocument追加する
  6. document の値を返す。

いずれの場合も、返される 文書コンテンツタイプtype 引数でなければならない。さらに、 文書は、 URL 値として アクティブ文書の URL と等しい値を持ち、 location 値として null を持たなければならない。

注記

返される 文書エンコーディングは、 既定値の UTF-8 である。

パラメーター null 可能 省略可能 説明
str DOMString
type SupportedType
返り値の型: Document

6. XMLSerializer インターフェイス

XMLSerializer() コンストラクターは、新しい XMLSerializer オブジェクトを返さなければならない。

[Constructor]
interface XMLSerializer {
    DOMString serializeToString (Node root);
};

6.1 メソッド

serializeToString
serializeToString(root) メソッドは、root の XML 直列化を生成しなければならない。 このとき require well-formed パラメーターには false の値を渡し、その結果を返す。
パラメーター null 可能 省略可能 説明
root Node
返り値の型: DOMString

7. Element インターフェイスへの拡張

partial interface Element {
    [CEReactions, TreatNullAs=EmptyString]
                    attribute DOMString innerHTML;
    [CEReactions, TreatNullAs=EmptyString]
                    attribute DOMString outerHTML;
    [CEReactions]
    void insertAdjacentHTML (DOMString position, DOMString text);
};

7.1 属性

innerHTML、型 DOMString

innerHTML IDL 属性は、 Element の 内容のマークアップを表す。

element . innerHTML [ = value ]

要素の内容を表す HTML または XML のフラグメントを返す。

設定することができ、要素の内容を、与えられた文字列から 構文解析されたノードで置き換える。

XML 文書の場合、 Element を XML に直列化できない場合は、name が "InvalidStateError" である DOMException を投げ、与えられた文字列が整形式でない場合は、name が "SyntaxError" である DOMException を投げる。

取得時には、 コンテキストオブジェクトに対して、 require well-formed フラグに true を与えて フラグメント直列化アルゴリズムを 呼び出した結果を返す(これは文字列を返す代わりに例外を投げる可能性がある)。

設定時には、次の手順を実行しなければならない:

  1. fragment を、 新しい値を markup とし、 コンテキストオブジェクトcontext element として フラグメント構文解析アルゴリズムを 呼び出した結果とする。
  2. コンテキストオブジェクト内の すべてを fragment置き換える
outerHTML、型 DOMString

outerHTML IDL 属性は、 Element およびその内容のマークアップを表す。

element . outerHTML [ = value ]

要素およびその内容を表す HTML または XML のフラグメントを返す。

設定することができ、要素を、与えられた文字列から構文解析された ノードで置き換える。

XML 文書の場合、 要素を XML に直列化できない場合は、name が "InvalidStateError" である DOMException を投げ、与えられた文字列が整形式でない場合は、name が "SyntaxError" である DOMException を投げる。

要素の親が Document ノードである場合、name が "NoModificationAllowedError" である DOMException を投げる。

取得時には、唯一の子が コンテキストオブジェクトである 架空のノードに対して、 require well-formed フラグに true を与えて フラグメント直列化アルゴリズムを 呼び出した結果を返す(これは文字列を返す代わりに例外を投げる可能性がある)。

設定時には、次の手順を実行しなければならない:

  1. parent を、 コンテキストオブジェクトとする。
  2. parent が null である場合、これらの手順を終了する。残りの手順が 実行されたとしても、作成されたノードへの参照を得る方法はない。
  3. parentDocument である場合、name が "NoModificationAllowedError" である DOMException 例外を投げる。
  4. parentDocumentFragment である場合、 parent を、次を持つ新しい Element とする:
  5. fragment を、 新しい値を markup とし、parentcontext element として フラグメント構文解析アルゴリズムを 呼び出した結果とする。
  6. コンテキストオブジェクトを、 コンテキストオブジェクト内で fragment置き換える

7.2 メソッド

insertAdjacentHTML
element . insertAdjacentHTML(position, text)

与えられた文字列 text を HTML または XML として構文解析し、 結果のノードを、position 引数で与えられた位置に従って 木に挿入する:

"beforebegin"
要素そのものの前。
"afterbegin"
要素のすぐ内側、その最初の子の前。
"beforeend"
要素のすぐ内側、その最後の子の後。
"afterend"
要素そのものの後。

引数が無効な値を持つ場合(たとえば XML 文書の場合に、与えられた文字列が 整形式でない場合)、name が "SyntaxError" である DOMException を投げる。

与えられた位置が不可能である場合(たとえば Document のルート要素の後に要素を挿入する場合)、name が "NoModificationAllowedError" である DOMException を投げる。

insertAdjacentHTML(position, text) メソッドは次の手順を実行しなければならない:

  1. このリストから最初に一致する項目を使用する:
    position が文字列 "beforebegin" に ASCII 大文字小文字不区別で一致する場合
    position が文字列 "afterend" に ASCII 大文字小文字不区別で一致する場合

    context を、 コンテキストオブジェクトとする。

    context が null または 文書である場合、 name が "NoModificationAllowedError" である DOMException を投げる。

    position が文字列 "afterbegin" に ASCII 大文字小文字不区別で一致する場合
    position が文字列 "beforeend" に ASCII 大文字小文字不区別で一致する場合
    contextコンテキストオブジェクトとする。
    そうでない場合

    name が "SyntaxError" である DOMException を投げる。

  2. contextElement でない場合、または次のすべてが真である場合:

    context を、次を持つ新しい Element とする:

  3. fragment を、textmarkup とし、contextcontext element として フラグメント構文解析アルゴリズムを 呼び出した結果とする。
  4. このリストから最初に一致する項目を使用する:
    position が文字列 "beforebegin" に ASCII 大文字小文字不区別で一致する場合
    fragment を、 コンテキストオブジェクト内の、 コンテキストオブジェクトの前に 挿入する
    position が文字列 "afterbegin" に ASCII 大文字小文字不区別で一致する場合
    fragment を、 コンテキストオブジェクト内の、 その 最初の子の前に 挿入する
    position が文字列 "beforeend" に ASCII 大文字小文字不区別で一致する場合
    fragmentコンテキストオブジェクト追加する
    position が文字列 "afterend" に ASCII 大文字小文字不区別で一致する場合
    fragment を、 コンテキストオブジェクト内の、 コンテキストオブジェクト次の兄弟の前に 挿入する
パラメーター null 可能 省略可能 説明
position DOMString
text DOMString
返り値の型: void

8. Range インターフェイスへの拡張

partial interface Range {
    [CEReactions, NewObject]
    DocumentFragment createContextualFragment (DOMString fragment);
};

8.1 メソッド

createContextualFragment
docFragment = range . createContextualFragment(markupString)
与えられたマークアップ文字列から作成された DocumentFragment を返す。

createContextualFragment(fragment) メソッドは次の手順を実行しなければならない:

  1. node を、 コンテキストオブジェクト始端ノードとする。

    node のインターフェイスに応じて、element を次のようにする:

    Document
    DocumentFragment
    null
    Element
    node
    Text
    Comment
    node親要素
    DocumentType
    ProcessingInstruction
    [DOM4] はこの場合を防ぐ。
  2. element が null であるか、または次のすべてが真である場合:

    element を、次を持つ新しい 要素とする:

  3. fragment node を、fragmentmarkup とし、elementcontext element として フラグメント構文解析アルゴリズムを 呼び出した結果とする。
  4. fragment node 内のすべてのスクリプトについて、"already started" の印を外す。
  5. fragment node の値を返す。
パラメーター null 可能 省略可能 説明
fragment DOMString
返り値の型: DocumentFragment

A. 改訂履歴

以下は、この仕様の前回公開以降の変更についての参考情報としての要約である。 この仕様のエディターズドラフトの完全な改訂履歴は ここで見つけることができる。

B. 謝辞

この仕様の初期草案を保守し、また Living Specification において 継続的に改善してくれた Ms2ger [Mozilla] に感謝する。

有用なコメントを寄せてくれた Victor Costan、 Aryeh Gregor、 Anne van Kesteren、 Arkadiusz Michalski、 Simon Pieters、 Henri Sivonen、 Josh Soref および Boris Zbarsky に感謝する。

innerHTML および outerHTML 属性、ならびに insertAdjacentHTML() メソッドを [HTML5] で定義し、有用なコメントを寄せてくれた Ian Hickson に特別に感謝する。

C. 参考文献

C.1 規範的参考文献

[HTML5]
Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Edward O'Connor; Silvia Pfeiffer. W3C. HTML5. 2014年10月28日. W3C 勧告. URL: http://www.w3.org/TR/html5/
[RFC2119]
S. Bradner. IETF. RFC において 要求レベルを示すために用いるキーワード. 1997年3月. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[WEBIDL]
Cameron McCormack; Boris Zbarsky. W3C. WebIDL Level 1. 2016年3月8日. W3C 候補勧告. URL: http://www.w3.org/TR/WebIDL-1/

C.2 参考情報文献

[DOM4]
Anne van Kesteren; Aryeh Gregor; Ms2ger; Alex Russell; Robin Berjon. W3C. W3C DOM4. 2015年11月19日. W3C 勧告. URL: http://www.w3.org/TR/dom/
[XML10]
Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau et al. W3C. Extensible Markup Language (XML) 1.0 (Fifth Edition). 2008年11月26日. W3C 勧告. URL: http://www.w3.org/TR/xml