Синтаксический анализ специальных символов XML: Excel VBA Runtime error 91

Когда XML разбирает специальные символы — моя конкретная проблема связана с амперсандами — Excel VBA выдает ошибку

Ошибка времени выполнения 91: переменная объекта или переменная блока не установлены

PHP-код для разбора XML:

$xml = '<?xml version="1.0" encoding="UTF-8" ?>
<root> <EngineerFName>'.$engineer_fname.'</EngineerFName>
<CustomerName>'.$customer_name.'</CustomerName>
<EngineerLName>'.$engineer_lname.'</EngineerLName>
<TopName>'.$dt_top_name.'</TopName>
</root>';

Код Excel Vba:

Dim XDoc1 As Object
Dim XHTML1 As IHTMLElement
Dim XURL1 As String
Dim CustomerName1 As String
Set XDoc1 = CreateObject("MSXML2.DOMDocument")
XDoc1.async = False: XDoc1.validateOnParse = False
XDoc1.Load ("http://www.beamon.com/windows_application/macro2.php" +  "?Id=" + Sheets(1).Range("D2"))
Set lists = XDoc1.DocumentElement
Set getFirstChild = lists.FirstChild
Set getCustomerName1 = lists.ChildNodes(1)
Set getEnglname = lists.ChildNodes(2)
Set getTopCustomer = lists.ChildNodes(3)

Sheets(1).Range("T5") = getCustomerName1.text
Sheets(1).Range("T6") = getFirstChild.text & Space(1) & getEnglname.text
Sheets(1).Range("T7") = getTopCustomer.text
Set XDoc1 = Nothing

Кто-нибудь может предложить решение?

1

Решение

Есть хорошая статья о вашей проблеме на TechRepublic — цитируя необходимую часть:

Когда анализатор XML находит амперсанд в данных XML, он ожидает найти имя символа и точку с запятой после него. Имя символа предоставляет символическую ссылку на другой объект или символ, такой как символы амперсанда, больше и меньше чем символы. Символическое имя для больше-больше — это gt, а для меньше-чем — это lt. Чтобы включить символ «больше» в данные XML, необходимо использовать следующий синтаксис: &gt;

Если вы уже получили ответ со страницы PHP, тогда решение вашей проблемы заключается в следующем:

strXml = VBA.Replace(strXml, "&", "&amp;")

Но ваша проблема в том, что вы используете Load метод DOMDocument класс и PHP испускает недопустимый XML. Страница PHP должна сделать эту кодировку за вас — я предполагаю, что она просто запрашивает какое-то хранилище данных и помещает его в строку XML, что выводит его на экран без какой-либо проверки значений. Ваш Load Метод не будет ошибкой, но в тот момент, когда вы захотите проанализировать DOM, вы получите проблему.

Поскольку вы уже ссылаетесь на библиотеку MSXML, возможно, ваш вариант — использовать класс XMLHTTP для получения ответа, выполнить замену самостоятельно, а затем загрузить его в DOMDocument, используя LoadXML метод. Посмотрите код ниже — он не проверен, так как я не знаю параметра для вашего URL:

Option Explicit

Sub TextXMLGetAndParse()

Dim strUrl As String
Dim objXhr As MSXML2.XMLHTTP
Dim strXml As String
Dim objXmlDoc As MSXML2.DOMDocument

Set objXhr = New MSXML2.XMLHTTP
Set objXmlDoc = New MSXML2.DOMDocument

' do a XHR GET to your URL
strUrl = "http://www.beamon.com/windows_application/macro2.php" + "?Id=" + Sheets(1).Range("D2")
With objXhr
.Open "GET", strUrl, False
.send
strXml = .responseXML
End With

' do the clean-up that the PHP page should do for you
strXml = VBA.Replace(strXml, "&", "&amp;")

' load that XML to you DOMDOcument
objXmlDoc.LoadXML strXml

' check values
Debug.Print objXmlDoc.DocumentElement.Text
Debug.Print objXmlDoc.DocumentElement.FirstChild.Text
Debug.Print objXmlDoc.DocumentElement.ChildNodes(1).Text
Debug.Print objXmlDoc.DocumentElement.ChildNodes(2).Text
Debug.Print objXmlDoc.DocumentElement.ChildNodes(3).Text

' clean up
Set objXhr = Nothing
Set objXhr = Nothing

End Sub
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]