【问题标题】:XML parsing special characters: Excel VBA Run time error 91XML 解析特殊字符:Excel VBA 运行时错误 91
【发布时间】:2017-04-06 07:06:54
【问题描述】:

当 XML 解析特殊字符时 - 我的具体问题是 & 符号 - Excel VBA 抛出错误

运行时错误 91:对象变量或未设置块变量

用于 XML 解析的 PHP 代码:

$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

谁能提出解决方案?

【问题讨论】:

  • 哪一行导致您的错误?
  • 在 Excel Vba 代码第 9 行“Set getFirstChild = lists.FirstChild”导致“运行时错误 91:对象变量或未设置块变量”
  • 我认为 XML 文件中没有 FirstChild,因为 macro2.php 正在传递错误的文件或空文件,或者由于提交了错误的 ID 或类似的东西而出现了奇怪的东西。确保加载的文件 100% 正确。
  • 您正在生成一个 XML 字符串,而没有对您输入的值进行任何转义。使用转义函数甚至更好地使用 XML API 在 PHP 中生成 XML。
  • 我很确定您的文件不是有效的 XML。在 XML 验证器中对其进行测试,例如:xmlvalidation.com

标签: php xml excel xml-parsing vba


【解决方案1】:

Techrepublic 上有一篇关于您的问题的好文章 - 引用了必要的部分:

当 XML 解析器在 XML 数据中找到一个 & 符号时,它希望找到一个符号名称和一个分号。符号名称提供对另一个实体或字符的符号引用,例如与号、大于和小于字符。大于的符号名称是 gt,小于的符号名称是 lt。要在 XML 数据中包含大于号字符,您必须使用以下语法:&amp;gt;

如果您已经收到来自 PHP 页面的响应,那么解决问题的方法就是这样做:

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

但是您的问题是您正在使用 DOMDocument 类的 Load 方法,并且 PHP 发出无效的 XML。 PHP 页面应该为您执行此编码 - 我的猜测是它只是查询一些数据存储并将其插入 XML 字符串并回显它而不对值进行任何验证。您的Load 方法不会出错,但是当您要解析 DOM 时,您就会遇到问题。

鉴于您已经在引用 MSXML 库,也许您的选择是使用 XMLHTTP 类来获取响应,自己进行替换,然后使用 LoadXML 方法将其加载到 DOMDocument。请参阅下面的代码 - 因为我不知道您的 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

【讨论】:

  • hai Robin 我不知道如何使用 th xml http 类,现在我已经完全更改并在您的代码上运行它在此代码上显示错误运行时错误 13 Set objXhr1 = New MSXML2.DOMDocument
  • 嗨 - 是的,代码中有错误 - 我更正了。你可以再试一次吗?
  • 嗨罗宾感谢您的回复!但似乎又出现了错误:strXml = .responseXML 运行时错误:438 对象不支持属性或方法
  • 嗨 - 试试.responseText 吗?如果它有效,我将更新代码。不幸的是,无法对此进行测试,因为您无法使用 PHP 访问您的 URL。
  • 嗨,罗宾,我现在再次更改您的建议,此行 Debug.Print objXmlDoc.DocumentElement.text 运行时错误 91 对象或未设置块变量发生错误...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多