XML解析失败:预期空白字符,VBA发送POST请求XML文档报错求助
解析XML失败:预期空白字符的原因及解决方案
我来帮你拆解这个问题的根源,然后给出可行的修复方案:
错误原因分析
错误使用HTML转义符
你在拼接XML时用了<(代替<)和&(代替&)这类HTML转义字符,但服务器期望接收的是原始XML格式。这些转义符会被XML解析器当作普通文本处理,导致无法识别正确的XML标签结构——解析器看到&时会认为是实体引用的开头,但后续找不到合法的实体结尾,进而触发“预期空白字符”的异常。XML文档不完整
你的代码里DOCTYPE声明没有闭合(最后一行是...截断状态),而且缺少后续的XML根元素和闭合标签。不完整的XML结构必然会让解析器无法正常解析。
解决方案
1. 修正XML字符串拼接方式
在VBA中,直接使用原始XML字符即可,只需要用双引号""来转义字符串中的双引号(VBA语法规则),不需要用HTML转义符。
2. 确保XML结构完整
按照目标服务器提供的DTD规范,补全所有必要的标签,包括闭合DOCTYPE声明、根元素及子元素。
修正后的代码示例
Sub testmessage() Dim sXML As String, sURL As String, sResponse As String Dim WinHttpReq As Object Set WinHttpReq = CreateObject("MSXML2.ServerXMLHTTP") ' 正确构建XML字符串,使用原始XML语法,VBA中用""转义" sXML = "<?xml version=""1.0"" encoding=""ISO-8859-1""?>" sXML = sXML & "<!DOCTYPE pnet_imessage_send PUBLIC ""-//PeopleNet//pnet_imessage_send""" sXML = sXML & " ""http://open.peoplenetonline.com/dtd/pnet_imessage_send.dtd"">" ' 根据DTD要求添加根元素和子内容,这里请替换为实际需要的内容 sXML = sXML & "<pnet_imessage_send>" sXML = sXML & " <message_content>测试消息内容</message_content>" sXML = sXML & " <!-- 补充其他符合DTD的必填元素 -->" sXML = sXML & "</pnet_imessage_send>" ' 替换为你的实际服务器请求URL sURL = "https://your-target-server.com/api/endpoint" ' 配置并发送POST请求 WinHttpReq.Open "POST", sURL, False ' 务必设置正确的Content-Type,告诉服务器请求主体是XML WinHttpReq.setRequestHeader "Content-Type", "text/xml; charset=ISO-8859-1" WinHttpReq.send sXML ' 获取并输出响应 sResponse = WinHttpReq.responseText MsgBox "服务器响应:" & vbCrLf & sResponse ' 释放对象 Set WinHttpReq = Nothing End Sub
额外注意事项
- 严格对照
pnet_imessage_send.dtd的要求编写XML内容,确保所有必填元素、属性都正确设置,标签嵌套和闭合无误。 - 如果服务器需要身份验证(比如Basic Auth),可以添加请求头:
WinHttpReq.setRequestHeader "Authorization", "Basic " & Base64Encode("用户名:密码")(需要自行实现Base64编码函数)。 - 可以先把构建好的XML字符串输出到记事本,用本地XML校验工具验证格式是否正确,再发送请求。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

