XML解析特殊字符:Excel VBA运行时错误91

When XML parsing special characters - my specific issue is with ampersands - Excel VBA is throwing the error

Run time error 91: Object variable or With block variable not set

PHP code for XML Parsing:

$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 code:

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

Can anyone suggest a solution?

douxing2652
douxing2652 我很确定你的文件不是有效的XML。在XML验证器中测试它,例如:xmlvalidation.com
3 年多之前 回复
dsv73806
dsv73806 现在我再次检查并运行我的代码ID绝对正确且工作正常但我的问题是我无法使用&符号(&)特殊字符
3 年多之前 回复
dongmi19720408
dongmi19720408 没有FirstChild,如果他们的xml值没有使用特殊字符,那么它的工作100%文件......实际的问题是当我使用特殊字符(&)时发生了这种错误...例如:工作名称:manoj,jano等...错误名称:manoj&,jano-等...
3 年多之前 回复
doujizhong8352
doujizhong8352 您正在生成一个XML字符串,而不会为您放入的值进行任何转义。使用转义函数或甚至更好地使用XMLAPI在PHP中生成XML。
3 年多之前 回复
douhu2131
douhu2131 我认为XML文件中没有FirstChild,因为macro2.php提交了一个错误的文件或空文件,或者由于提交了错误的ID或者类似的东西而导致奇怪的东西。确保加载的文件100%正确。
3 年多之前 回复
douniang3866
douniang3866 是的上面的代码运行,但是当我用特殊字符解析xml值时,会导致错误
3 年多之前 回复
droxy80248
droxy80248 上面的VBA代码运行没有错误,因此无法重现您的问题。我们需要知道你试图使用哪个id(Sheets(1).Range(“D2”)),即便如此,它可能是一个问题,而不是代码。
3 年多之前 回复
dongyuan8312
dongyuan8312 在ExcelVba代码中,第9行“SetgetFirstChild=lists.FirstChild”导致“运行时错误91:对象变量或未设置块变量”
3 年多之前 回复
doupu1949
doupu1949 哪一行会导致您的错误?
3 年多之前 回复

1个回答

There's a good article on your problem at Techrepublic - quoting the necessary part:

When the XML parser finds an ampersand in the XML data, it expects to find a symbol name and a semicolon following it. The symbol name provides a symbolic reference to another entity or character such as the ampersand, greater-than, and less-than characters. The symbolic name for greater-than is gt and for less-than is lt. To include a greater-than character in the XML data, you must use the following syntax: &gt;

If you already had the response from the PHP page then the solution to your problem is simply to do this:

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

But your issue is that you are using the Load method of the DOMDocument class and the PHP is emitting invalid XML. The PHP page should do this encoding for you - my guess is that it just queries some data store and slots it into an XML string an echos it without doing any validation on the values. Your Load method will not error, but the moment you want to parse the DOM, you get the problem.

Given you are already referencing the MSXML library, perhaps your option is to use the XMLHTTP class to get the response, do the replacement yourself, and then load it the DOMDocument using the LoadXML method. See the code below - it is not tested as I don't know the parameter for your 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
douyi6922
douyi6922 好 - 终于我们搞定了! 要写到工作表,您可以使用:Sheets(1).Range(“T5”)= objXmlDoc.DocumentElement.ChildNodes(1).Text或者您可以将列表设置为objXmlDoc.DocumentElement并使用类似的代码来发布您发布的内容 在你原来的问题。 在我使用Debug.Print的地方你可以使用Sheets(1).Range(“A1”)= ... HTH
3 年多之前 回复
douchun2158
douchun2158 嗨感谢知更鸟:)它的工作:)但我怎么能在excel细胞中分配值?
3 年多之前 回复
drngnh708353
drngnh708353 对不起 - 另一个错误 - XMLHTTP调用不应该是异步 - 所以我将此行修改为.Open“GET”,strUrl,True to .Open“GET”,strUrl,False
3 年多之前 回复
dongyong5912
dongyong5912 当我将strXml = .responseXML调试到strXml = .responseText时,它将显示运行时错误'-2147483638(80000000a)'必要的数据已完成此操作尚不可用
3 年多之前 回复
dongzhuan1185
dongzhuan1185 Debug.Print strXml会发生什么? 你可以发表评论吗?
3 年多之前 回复
douli1854
douli1854 嗨罗宾我改变你的建议现在再次出现此行错误Debug.Print objXmlDoc.DocumentElement.text运行时错误91对象或未设置块变量...
3 年多之前 回复
doulan9188
doulan9188 嗨 - 尝试.responseText而不是? 如果它工作,我将更新代码。 不幸的是无法测试这个,因为无法使用PHP访问您的URL。
3 年多之前 回复
douguabu8960
douguabu8960 知更喜欢谢谢你的回复! 但同样在行上似乎出现错误:strXml = .responseXML运行时错误:438对象不支持属性或方法
3 年多之前 回复
drpfu51608120170
drpfu51608120170 嗨 - 是的,代码中有错误 - 我纠正了它。 你可以再试一次吗?
3 年多之前 回复
drba1172
drba1172 hai Robin我不知道如何使用xml http类现在我已完全更改并在你的代码上运行它显示错误运行时错误13对此代码设置objXhr1 =新MSXML2.DOMDocument
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐