5

オブジェクトのを設定するdoctypeにはどうすればよいですか?DOMDocument60

たとえば、私は試します:

IXMLDOMDocument60 doc = new DOMDocument60();
doc.doctype.name = "html";

IXMLDOMDocumentType.nameそれが読み取り専用であることを除いて:

IXMLDOMDocumentType = interface(IXMLDOMNode)
{
   ['{2933BF8B-7B36-11D2-B20E-00C04F983E60}']
   string Get_name();
   ...
   property String name read Get_name;
}

読み取り専用IXMLDOMDocument60.doctypeです:

IXMLDOMDocument = interface(IXMLDOMNode)
{
   ['{2933BF81-7B36-11D2-B20E-00C04F983E60}']
   IXMLDOMDocumentType Get_doctype();
   ...
   property IXMLDOMDocumentType doctype read Get_doctype;
}

doctypeでは、どうすればXMLドキュメントのを設定できますか?


ボーナス質問:指定されたオブジェクトを作成するにはどうすればよいですか?DOMDocument60doctype


注: XSLTについては言及されていないため、言及されていません。MSXMLでHTMLDOMツリーを構築しています。

4

1 に答える 1

3

パフォーマンス上の理由とセキュリティ上の理由から、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;
}
于 2016-08-21T07:19:18.600 に答える