

* createDocument method (DOM DOMImplementation 界面)

[1] [CODE[[VAR[([CODE(DOMi)[[[Document]]]])]] := [VAR(DOMi)[[[DOMImplementation]]]].[CODE(DOMmethod)[createDocument]] ([VAR(DOMparam)[([CODE(DOMi)[[[DOMString]]]]) namespaceURI]], [VAR(DOMparam)[([CODE(DOMi)[DOMString]]) qualifiedName]], [VAR(DOMparam)[([CODE(DOMi)[[[DocumentType]]]]) doctype]])]]
は、新しい文書 ([CODE(DOM)[Document]] ([[文書節]]) 物体)
を作成します。

[VAR(DOMparam)[qualifiedName]] には、[[文書要素]]の要素型名を[[修飾名]]で指定します。

[VAR(DOMparam)[namespaceURI]], [VAR(DOMparam)[doctype]]
は必要がなければ [CODE(DOM)[null]] でも構いません。

[2] 実行結果:
,返値	,[CODE(DOM)[[[Document]]]]	,作成された文書
,例外 [CODE(DOM)[[[DOMException]]]]	,[CODE(DOMconst)[[[INVALID_CHARACTER_ERR]]]]	,修飾名に不正な文字
,例外 [CODE(DOM)[DOMException]]	,[CODE(DOMconst)[[[NAMESPACE_ERR]]]]	,修飾名が不正か接頭辞があるのに [VAR(DOMparam)[namespaceURI]] が [CODE(DOM)[null]] か、又は予約名前空間名/接頭辞の不正な利用
,例外 [CODE(DOM)[DOMException]]	,[CODE(DOMconst)[[[WRONG_DOCUMENT_ERR]]]]	,[VAR(DOMparam)[doctype]] が既に他の文書で使われているか、又は異なる実装で作成された

[CODE[[VAR(DOM)[doctype]].[CODE(DOMa)[[[ownerDocument]]]]]]
は新しく作成された [VAR(DOM)[Document]] に設定されます。

[3] この method は DOM 2 です。
なお、 HTML のみの DOM 実装では実装しなくても構わないことになっています。

[4] 仕様書:
= [DOM2] [CITE@en[Document Object Model Core]] 
-- <IW:DOM2:"Core/core.html#Level-2-Core-DOM-createDocument">
= [DOM3] [CITE@en[Document Object Model Core]] 
-- <IW:DOM3:"Core/core.html#Level-2-Core-DOM-createDocument">


** HTML 文書を作成するには

[5]
仕様によれば、 [CODE(DOMp)@en[doctype]] 引数に適当な値を与えれば
[CODE(DOM)@en[[[HTML]]]] [[機能]]など [CODE(DOM)@en[[[Core]]]]
以外の[[機能]]を実装した [CODE(DOMi)@en[[[Document]]]]
を返して良いとされています。また、 [[DOM水準2]]
の [CODE(DOMm)@en[[[createHTMLDocument]]]]
のような特化した[[メソッド]]を使う方法もあると触れられています。

[6]
後者の方法、すなわち [CODE(DOMi)@en[[[HTMLDocument]]]]
[[界面]]の [CODE(DOMm)@en[[[createHTMLDocument]]]]
[[メソッド]]は、旧来の [[HTML]] (''非'' [[XHTML]])
[CODE(DOMi)@en[[[HTMLDocument]]]] を作成するためのもので、
[[DOM水準2]] 仕様案には含まれていましたが、
[[勧告]]になる前に削除されています。
[WEAK[(それなのに別のモジュールの仕様書に言及が残っているなんてことは [[DOM]] の仕様書ではよくあります。)]]
[CODE(DOMm)@en[[[createDocument]]]]
があれば十分ということらしいです。

[7]
前者の方法、すなわち [CODE(DOMi)@en[[[Document]]]]
[[界面]]の [CODE(DOMm)@en[[[createDocument]]]]
[[メソッド]]に適当な [CODE(DOMp)@en[[[doctype]]]]
[[引数]]を与える方法は、それ以上の詳細は説明されていません。
つまり、どのような [CODE(DOMp)@en[[[doctype]]]]
を与えればどのような[[機能]]を持った[[物体]]が返されるかは実装依存ということになります。

[CODE(DOMm)@en[[[createDocumentType]]]] 
[[メソッド]]の[[引数]]には[[公開識別子]]と[[システム識別子]]がありますから、
[CODE(DOMi)@en[[[DocumentType]]]] の種類はこれらから判断されると思われます。
[WEAK[([[修飾名]]もありますが、[[名前空間URI]] はないのでここから判断するのは少し不安です。)]]
これらの引数に [[XHTML]] で定義されている値を与えれば、
おそらく [CODE(DOMi)@en[[[HTMLDocument]]]]
が得られるのでしょう。

[8]
'''[CODE(DOMm)@en[[[createDocument]]]] の名前空間 URI と局所名で指定''':
[CODE(DOMm)@en[[[createDocument]]]] の[[引数]]には[[文書要素]]の[[名前空間URI]]
と[[修飾名]]も指定できます。仕様書には何も書かれていませんが、
多くの場合には [CODE(DOMp)@en[[[doctype]]]]
がなくともこれらの引数の情報だけで実装側としては十分なはずです。

[[XHTML]] の場合、[[名前空間URI]] に
[CODE(URI)@en[[[http://www.w3.org/1999/xhtml]]]]、
[[修飾名]]中の[[局所名]]に [CODE(XMLe)@en[[[html]]]]
を与えれば、実装によっては [CODE(DOMi)@en[[[HTMLDocument]]]]
が得られると期待できます。

[[#comment]]


** メモ

[9]
[CODE(DOM)@en[[[null]]]]を[[引数]]にした場合の動作について仕様書は適当すぎる。
([[名無しさん]] [sage])

[10]
[[DOM水準3]]は [CODE(DOMp)@en[[[qualifiedName]]]]
は [CODE(IDL)@en[[[null]]]] でもよいと明記しています。
([[名無しさん]])

[11]
[[DOM水準3]]によると
[CODE(DOMp)@en[[[qualifiedName]]]] を指定する場合には
[[XML 1.0]] の[[名前]]でなければならないようです。

([[名無しさん]])

[12]
>>10 のため、 [[DOM水準3]]では
[CODE(DOMc)@en[[[NAMESPACE_ERR]]]] の条件として
[CODE(DOMp)@en[[[qualifiedName]]]] が
[CODE(IDL)@en[[[null]]]] で
[CODE(DOMp)@en[[[namespaceURI]]]]
が [CODE(IDL)@en[[[null]]]] ではないときが追加されています。
([[名無しさん]])

[13]
[[DOM水準3]]の [CODE(DOMm)@en[[[createElementNS]]]] では
- [[修飾名]]または[[名前空間接頭辞]]が
[CODE(XML)@en[[[xmlns]]]] で、[[名前空間URI]]
が [CODE(URI)@en[[[http://www.w3.org/2000/xmlns/]]]]
ではないとき
- [[名前空間URI]] が
[CODE(URI)@en[[[http://www.w3.org/2000/xmlns]]]]
で[[修飾名]]も[[名前空間接頭辞]]も
[CODE(XML)@en[[[xmlns]]]] ではないとき

に [CODE(DOMc)@en[[[NAMESPACE_ERR]]]]
ですが、 [CODE(DOMm)@en[[[createDocument]]]]
にはそうは書かれていません。
([[名無しさん]])

[14]
[[Firefox]] 2 でも [[Opera]] 9 でも、 [[XML]] [[文書]]が作られるのですが、
[[Opera]] 9 では [CODE(DOMa)@en[[[innerHTML]]]] や
[CODE(DOMa)@en[[[outerHTML]]]] の動作が元々の[[文書]]と同じになるようです。
つまり、 [[HTML]] [[文書]]の [CODE(DOMa)@en[[[implementation]]]]
[[属性]]に入っている [CODE(DOMi)@en[[[DOMImplementation]]]]
の [CODE(DOMm)@en[[[createDocument]]]] [[メソッド]]で
[[XHTML]] [[文書]]を作ると、 [CODE(DOMa)@en[[[namespaceURI]]]]
は [[XHTML]] だし、 [CODE(DOMa)@en[[[tagName]]]] も[[小文字]]なのに、
[CODE(DOMa)@en[[[innerHTML]]]] 内の[[タグ名]]は[[大文字]]になります。

;; <http://suika.fam.cx/~wakaba/-temp/test/dom/dom-implementation/create-document/>

([[名無しさん]])

[15]
>>14 [[HTML]] [[文書]]内の [CODE(DOMi)@en[[[XMLHttpRequest]]]]
で得た [CODE(DOMi)@en[[[Document]]]] もそうなってるっぽい。。。
([[名無しさん]])


[16]
>>15 [CODE(DOMi)@en[[[DOMParser]]]] で得たやつでも。

意図的かどうかわからないけど、
これのおかげ/せいで[[整形式]]でない値を [CODE(DOMa)@en[[[innerHTML]]]]
に設定しようとしてもエラーにならない ([[Firefox]] 2 ではなる)。

[17] [CITE[Hawk's W3 Laboratory : XML : JavaScriptでXMLを扱う方法]] ([TIME[2009-01-04 12:36:07 +09:00]] 版) <http://web.archive.org/web/20060902115316/www.hawk.34sp.com/stdpls/xml/js_xml.html>

>Geckoベースのブラウザで新規Documentオブジェクトを取得するには、DOM2 Coreで定義された DOMImplementation の createDocumentメソッドを用います。
[PRE(JS example code)[
var domDocument = document.implementation.createDocument("", "", null);
]PRE]

;; [18] [[QName]] [[空文字列]]でいいの?

[19] >>18 [[DOM3中核]]は何もいってなかったけど、 [[Web DOM Core]]
ではちゃんと[[空文字列]]は無視することになってるね。

;;
[CITE[Web DOM Core]] ([TIME[2008-12-14 08:42:48 +09:00]] 版) <http://simon.html5.org/specs/web-dom-core#dom-domimplementation-createdocument>

[20] [CITE@en[Align with origin changes in HTML · whatwg/dom@20b3f3e]]
([TIME[2016-04-06 17:15:05 +09:00]] 版)
<https://github.com/whatwg/dom/commit/20b3f3e427180e40531a40d1d93ea0097c221c90>

[21] [CITE@en[520969 – HTMLness of the createDocument() return value should be false regardless of doctype]]
([TIME[2016-04-16 23:49:39 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=520969>

[22] [CITE@en[Set createDocument()'s content type based on namespace · whatwg/dom@537e579]]
([TIME[2016-04-19 23:34:13 +09:00]] 版)
<https://github.com/whatwg/dom/commit/537e579fac8d0a99544d798bb7d46660e59ffc78>