Загрузка HTML-документа в DOM XML-анализатор в VBScript завершается неудачно, если присутствует тег <! DOCTYPE html> - PullRequest
0 голосов
/ 05 июля 2018

В настоящее время я пытаюсь использовать 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 голосов
/ 06 июля 2018

Во-первых, вы можете сузить причину проблемы, добавив некоторые проверки ошибок после load:

objXMLDoc.load(strFilePath)
If objXMLDoc.parseError.errorCode <> 0 Then
   MsgBox "ERROR when loading " + strFileName + ": " + objXMLDoc.parseError.reason
End If

(В зависимости от вашей среды VBScript вам, возможно, придется использовать что-то другое, чем MsgBox.)

Возможно, вы получите сообщение об ошибке

ошибка: DTD запрещен.

Причина в том, что загрузка синтаксиса DTD (например, !DOCTYPE) по умолчанию запрещена в MSXML 6.0. Подробнее см. Обзор безопасности MSXML . Вот соответствующая часть

Некоторые части XML (такие как DTD и встроенные схемы) по своей природе рискованны. В конфигурации установки по умолчанию MSXML 6.0 эти функции были отключены. Вы можете включить эти функции, но сначала убедитесь, что риски безопасности, связанные с ними, к вам не относятся.

Если вы попытаетесь загрузить DTD без явного включения свойства ProhibitDTD, вы получите следующую ошибку:

ошибка: DTD запрещен.

Если вы добавите строку

objXMLDoc.setProperty "ProhibitDTD", False

перед загрузкой ошибка DTD is probited больше не будет возникать.

Скорее всего, вам также придется добавить строку

objXMLDoc.validateOnParse = False

перед загрузкой, если ваш HTML-файл не содержит полного HTML DTD (обычно его нет).

Подводя итог, вот полный код:

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

Он может успешно загрузить и проанализировать этот файл:

<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
</head>

<body>
The content of the document......
</body>

</html> 

В последней строке будет выведено «1», так как есть только один тег.

Обратите внимание, что есть один недостаток: HTML не является XML! То есть не каждый HTML-файл является правильно сформированным XML-файлом. Например. если в приведенном выше примере HTML-файла будет тег <br> (без соответствия </br>), загрузка завершится неудачно. Только XML-файлы, совместимые с XML, могут быть открыты описанным выше способом.

...