如果存在标记,则无法在VBScript中的DOM XML解析器中加载HTML文档

时间:2018-07-05 17:48:57

标签: xml vbscript xmldom

我目前正在尝试使用VBScript对HTML文件进行批量修改。为此,我使用了Microsoft.XMLDOM对象。无法将我的HTML文件加载为XML文档。经过一些试验,似乎第一行的以下标记是罪魁祸首:

<!DOCTYPE html>

如果删除此行,我的脚本将按预期运行。如果包含此行,则不会加载。没有出现特定的错误消息,但是尝试从XMLDOM对象中获取任何内容将不会返回任何内容,当对象尝试加载的文件不存在时,这也是相同的行为。

有人知道为什么会发生这种情况以及如何解决这个问题吗?我无法从文件中删除此标记,因为它们是HTML文档,并且通常由其他应用程序重新生成。

这是我的代码示例:

strFilePath = WScript.Arguments(0)
strTitlePrefix = WScript.Argument(1)

Set objXMLDoc = CreateObject("Microsoft.XMLDOM")
objXMLDoc.Async = False

objXMLDoc.load(strFilePath)

Set objDoc = objXMLDoc.documentElement
Set objNodes = objDoc.selectNodes("//title")
For Each thisNode in objNodes
  OriginalTitle = thisNode.text
  NewTitle = TitlePrefix & OriginalTitle
  thisNode.text = NewTitle     
Next

此行失败:

Set objNodes = objDoc.selectNodes("//title")

这是错误消息:

Microsoft VBScript runtime error: Object required: 'objDoc'

如果我删除了试图读取的文档顶部的标签,则代码会执行我期望的操作,所以我知道问题是此标签导致它认为该文件不是XML文档。

1 个答案:

答案 0 :(得分:4)

首先,您可以通过在<input type="radio" name="radioButtonGroup" checked id="setProxyBtn" data-profileid="direct"/> <label for="direct">direct</label> <input type="radio" name="radioButtonGroup" id="setProxyBtn" data-profileid="fixed_servers"/> <label for="fixed_servers">fixed_servers</label> 之后添加一些错误检查来缩小问题原因:

load

(取决于您的VBScript环境,您可能必须使用objXMLDoc.load(strFilePath) If objXMLDoc.parseError.errorCode <> 0 Then MsgBox "ERROR when loading " + strFileName + ": " + objXMLDoc.parseError.reason End If 以外的其他语言。)

您可能会收到错误消息

  

错误:禁止使用DTD。

原因是默认情况下,MSXML 6.0中禁止加载DTD语法(例如MsgBox)。 有关详情,请参见MSXML Security Overview。这是相关的部分

  

XML的某些部分(例如DTD和内联架构)具有固有的风险。在MSXML 6.0的默认安装配置中,这些功能已被禁用。您可以随意启用这些功能,但首先应确保与它们相关的安全风险不适用于您。

     

如果您尝试在未显式启用ProhibitDTD属性的情况下加载DTD,则会收到以下错误消息:

     

错误:禁止使用DTD。

如果添加行

!DOCTYPE

在加载之前,将不再发生objXMLDoc.setProperty "ProhibitDTD", False 错误。

您很可能还必须添加行

DTD is probited

在加载之前,以防您的HTML文件不包含完整的HTML DTD(通常不包含)。

总结一下,这是完整的代码:

objXMLDoc.validateOnParse = False

它可以成功加载并解析此文件:

strFilePath = "C:\Temp\test.html"

Set objXMLDoc = CreateObject("Msxml2.DOMDocument.6.0")
objXMLDoc.Async = False
objXMLDoc.setProperty "ProhibitDTD", False
objXMLDoc.validateOnParse = False
objXMLDoc.load(strFilePath)
If objXMLDoc.parseError.errorCode <> 0 Then
   MsgBox "ERROR when loading " + strFileName + ": " + objXMLDoc.parseError.reason
End If

Set objDoc = objXMLDoc.documentElement

MsgBox TypeName(objDoc)
Set objNodes = objDoc.selectNodes("//title")
MsgBox objNodes.Length

由于只有一个标签,最后一行将输出“ 1”。

请注意,但是有一个缺点: HTML不是XML! 即并非每个HTML文件都是格式正确的XML文件。 例如。如果在上面的示例HTML文件中有一个<!DOCTYPE html> <html> <head> <title>Title of the document</title> </head> <body> The content of the document...... </body> </html> 标签(不匹配<br>),则加载将失败。 使用上述方法只能打开XML兼容的HTML文件。