如何使用 VBScript 将 DOCTYPE 属性 设置为 XML DOM?

How to set the DOCTYPE property to XML DOM using VBScript?

我使用 Msxml2.DOMDocument.6 创建了一个 XML 文件。通过 VBscript 库。

当前代码:

Set oXMLDoc = CreateObject("Msxml2.DOMDocument.6.0")

Set bookmap = oXMLDoc.createElement("bookmap")
oXMLDoc.appendChild bookmap

Set booktitle = oXMLDoc.createElement("booktitle")
bookmap.appendChild booktitle

Set mainbooktitle = oXMLDoc.createElement("mainbooktitle")
booktitle.appendChild mainbooktitle

Set booktitlealt = oXMLDoc.createElement("booktitlealt")
booktitle.appendChild booktitlealt

Set frontmatter = oXMLDoc.createElement("frontmatter")
bookmap.appendChild frontmatter

Set keydef1 = oXMLDoc.createElement("keydef")
frontmatter.appendChild keydef1
keydef1.setAttribute "keys", "copyright"

Set topicmeta1 = oXMLDoc.createElement("topicmeta")
keydef1.appendChild topicmeta1

Set keywords1 = oXMLDoc.createElement("keywords")
topicmeta1.appendChild keywords1

Set keyword1 = oXMLDoc.createElement("keyword")
keywords1.appendChild keyword1

Set keydef2 = oXMLDoc.createElement("keydef")
frontmatter.appendChild keydef2

keydef2.setAttribute "keys", "trademarks"

Set topicmeta2 = oXMLDoc.createElement("topicmeta")
keydef2.appendChild topicmeta2

Set keywords2 = oXMLDoc.createElement("keywords")
topicmeta2.appendChild keywords2

Set keyword2 = oXMLDoc.createElement("keyword")
keywords2.appendChild keyword2

Set keydef3 = oXMLDoc.createElement("keydef")
frontmatter.appendChild keydef3

keydef3.setAttribute "keys", "trademarks"

Set topicmeta3 = oXMLDoc.createElement("topicmeta")
keydef3.appendChild topicmeta3

Set keywords3 = oXMLDoc.createElement("keywords")
topicmeta3.appendChild keywords3

Set keyword3 = oXMLDoc.createElement("keyword")
keywords3.appendChild keyword3

Set notices = oXMLDoc.createElement("notices")
frontmatter.appendChild notices

Set booklists = oXMLDoc.createElement("booklists")
frontmatter.appendChild booklists

Set toc = oXMLDoc.createElement("toc")
booklists.appendChild toc

Set chapter = oXMLDoc.createElement("chapter")
bookmap.appendChild chapter

Set oIntro = oXMLDoc.createProcessingInstruction("xml","version='1.0' encoding='UTF-8'")
oXMLDoc.insertBefore oIntro,oXMLDoc.childNodes(0)

oXMLDoc.Save currentDirectory & "/output/maps/"& stringtoReplace & ".ditamap"

是否有方法或 属性 将 DOCTYPE 设置为以下内容:

<!DOCTYPE bookmap PUBLIC "-//OASIS//DTD DITA BookMap//EN" "bookmap.dtd">

实际输出

<?xml version="1.0" encoding="UTF-8"?>

<bookmap>
    <booktitle>
        <mainbooktitle/>
        <booktitlealt/>
    </booktitle>
    <frontmatter>
        <keydef keys="copyright">
            <topicmeta>
                <keywords>
                    <keyword/>
                </keywords>
            </topicmeta>
        </keydef>
        <keydef keys="trademarks">
            <topicmeta>
                <keywords>
                    <keyword/>
                </keywords>
            </topicmeta>
        </keydef>
        <keydef keys="trademarks">
            <topicmeta>
                <keywords>
                    <keyword/>
                </keywords>
            </topicmeta>
        </keydef>
        <notices/>
        <booklists>
            <toc/>
        </booklists>
    </frontmatter>
    <chapter/>
</bookmap>

预期输出

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookmap PUBLIC "-//OASIS//DTD DITA BookMap//EN" "bookmap.dtd">
<bookmap>
    <booktitle>
        <mainbooktitle/>
        <booktitlealt/>
    </booktitle>
    <frontmatter>
        <keydef keys="copyright">
            <topicmeta>
                <keywords>
                    <keyword/>
                </keywords>
            </topicmeta>
        </keydef>
        <keydef keys="trademarks">
            <topicmeta>
                <keywords>
                    <keyword/>
                </keywords>
            </topicmeta>
        </keydef>
        <keydef keys="trademarks">
            <topicmeta>
                <keywords>
                    <keyword/>
                </keywords>
            </topicmeta>
        </keydef>
        <notices/>
        <booklists>
            <toc/>
        </booklists>
    </frontmatter>
    <chapter/>
</bookmap>

在现有脚本的顶部试试这个:

Set oXMLDoc = CreateObject("Msxml2.DOMDocument.6.0")

oXMLDoc.setProperty "ProhibitDTD", False
oXMLDoc.validateOnParse = False
oXMLDoc.resolveExternals = False

xmlTemplate = "<!DOCTYPE bookmap PUBLIC ""-//OASIS//DTD DITA BookMap//EN"" ""bookmap.dtd"">" & vbCrLf & _
    "<bookmap />"

Loaded = oXMLDoc.loadXML(xmlTemplate)

If Not Loaded Then 
    WScript.Echo oXMLDoc.parseError.reason
    WScript.Quit 1
End If

Set bookmap = (oXMLDoc.getElementsByTagName("bookmap"))(0)

这应该允许您创建 DTD 而不会产生错误 "DTD is prohibited",并且应该允许您预填充一个现有的 XML 模板,您可以立即加载。

旁注:我无法在不产生错误 "This operation can not be performed on DOCTYPE node."

的情况下调用 oXMLDoc.createNode(10, "bookmap", "bookmap.dtd")

希望对您有所帮助。