パフォーマンス上の理由とセキュリティ上の理由から、Microsoftは通常許可していません<!DOCTYPE>
(別名、ドキュメントタイプ定義)。このため、loadXML
メソッドを使用してを設定する必要があります<!DOCTYPE>
。そのため、ドキュメントの作成またはインポート後に設定することはできません。
さらに、 MSXML6のデフォルトのセキュリティ設定のため、通常、。を持つXMLをインポートすることはできません<!DOCTYPE>
。ProhibitDTD
したがって、オブジェクトの設定を無効にする必要があります。
編集:HTML5はXMLではないことを知っておく必要があります。また、 XHTML5ではオプション<!DOCTYPE>
と見なされます。
まず、目的の出力から始めましょう。
<!DOCTYPE html>
<html />
構文に基づいて、C#を使用していて、への参照を追加していると想定していますmsxml6.dll
。次のコードを使用すると、これら2つの処理命令を作成できます。
MSXML2.DOMDocument60 doc = new MSXML2.DOMDocument60();
// Disable validation when importing the XML
doc.validateOnParse = false;
// Enable the ability to import XML that contains <!DOCTYPE>
doc.setProperty("ProhibitDTD", false);
// Perform the import
doc.loadXML("<!DOCTYPE html><html />");
// Display the imported XML
Console.WriteLine(doc.xml);
これもVBScriptで書かれたコードのコピーです。
Set doc = CreateObject("MSXML2.DOMDocument.6.0")
' Disable validation when importing the XML
doc.validateOnParse = False
' Enable the ability to import XML that contains <!DOCTYPE>
doc.setProperty "ProhibitDTD", false
' Perform the import
doc.loadXML "<!DOCTYPE html><html />"
' Display the imported XML
WScript.Echo objXML.xml
最後に、C++で記述されたコードのコピーを示します。
#include <comutil.h>
#pragma comment(lib, "comsuppw.lib")
#include <msxml6.h>
#pragma comment(lib, "msxml6.lib")
int main(int argc, char* argv[])
{
HRESULT hr = S_OK;
VARIANT_BOOL success = VARIANT_TRUE;
// IXMLDOMDocument2 is needed for setProperty
IXMLDOMDocument2 *doc;
// Initialize COM
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
// Create the object
hr = CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&doc);
if (SUCCEEDED(hr))
{
// Disable validation when importing the XML
hr = doc->put_validateOnParse(VARIANT_FALSE);
// Enable the ability to import XML that contains <!DOCTYPE>
hr = doc->setProperty(_bstr_t(L"ProhibitDTD"), _variant_t(VARIANT_FALSE));
// Perform the import
hr = doc->loadXML(_bstr_t(L"<!DOCTYPE html><html />"), &success);
// Retrieve the XML
_bstr_t output{};
hr = doc->get_xml(output.GetAddress());
// Display the imported XML
MessageBoxW(NULL, output, NULL, 0);
}
// Cleanup COM
CoUninitialize();
}
return 0;
}