我目前正在尝试使用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文档。
答案 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文件。