[英]Failed to parse XML: Whitespace expected
我有一個簡單的VBA功能,可以將POST發送到遠程服務器。 帖子正文是一個XML文檔。
Sub testmessage()
Dim sXML As String, sURL As String, sResponse As String
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("MSXML2.ServerXMLHTTP")
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""> "
sXML = sXML & "<pnet_imessage_send>"
sXML = sXML & " <cid>20</cid>"
sXML = sXML & " <pw>password</pw>"
sXML = sXML & " <vehicle_number>123</vehicle_number>"
sXML = sXML & " <deliver>now</deliver>"
sXML = sXML & " <freeform_message>This is Tim's test message.</freeform_message>"
sXML = sXML & "</pnet_imessage_send>"
'Test url'
'sURL = "https://open.pfmlogin.com/scripts/postp.dll"
'Live url
sURL = "https://oi.pfmlogin.com/scripts/open.dll"
WinHttpReq.Open "POST", sURL, False
WinHttpReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded;Charset=ISO-8859-1"
WinHttpReq.Send sXML
sResponse = WinHttpReq.responseText
Debug.Print sResponse
End Sub
sXML包含以下內容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE pnet_imessage_send PUBLIC "-//PeopleNet//pnet_imessage_send"
"http://open.peoplenetonline.com/dtd/pnet_imessage_send.dtd">
<pnet_imessage_send>
<cid>20</cid>
<pw>password</pw>
<vehicle_number>123</vehicle_number>
<deliver>now</deliver>
<freeform_message>This is Tim's test message.</freeform_message>
</pnet_imessage_send>
如果我使用Chrome的Postman插件發送此郵件 ,則它可以正常處理。 與VBA代碼一起發布時,它返回錯誤XML failed to parse. The reported error was: File: . Line: 1 Col: 19 Error: Whitespace expected at Line: 1 Position: 19
的錯誤XML failed to parse. The reported error was: File: . Line: 1 Col: 19 Error: Whitespace expected at Line: 1 Position: 19
XML failed to parse. The reported error was: File: . Line: 1 Col: 19 Error: Whitespace expected at Line: 1 Position: 19
XML failed to parse. The reported error was: File: . Line: 1 Col: 19 Error: Whitespace expected at Line: 1 Position: 19
。
如果我將數據發布到測試網址(它將反彈回發布到它的任何內容),它將顯示如下:
<?xml version="1.0"
encoding="ISO-8859-1"
><!DOCTYPE pnet_imessage_send PUBLIC "-//PeopleNet//pnet_imessage_send"
http://open.peoplenetonline.com/dtd/pnet_imessage_send.dtd
我相信服務器不會將換行符視為空格,導致XML解析器看起來像這樣: <?xml version="1.0"encoding="ISO-8859-1">
(“ 1.0”和“編碼)。 使用Postman撰寫的帖子沒有意外的換行符。 如何在VBA不破壞序言的情況下發布此數據?
此答案歸功於@TimWilliams。 找到他的一個帖子,如果有幫助,請給+1。
正如He和@Chillin所指出的那樣,表單數據需要進行url編碼(或以保留空白的方式進行編碼... HTML編碼也可能起作用,但我沒有嘗試過)。 只是將請求標頭設置為application/xml
並不會保留空白。
我從這篇SO帖子中使用了以下代碼: 如何在Excel VBA中URL編碼字符串? (因此,如果有幫助,也可以給它+1)
Public Function URLEncode( _
StringVal As String, _
Optional SpaceAsPlus As Boolean = False _
) As String
Dim StringLen As Long: StringLen = Len(StringVal)
If StringLen > 0 Then
ReDim result(StringLen) As String
Dim i As Long, CharCode As Integer
Dim Char As String, Space As String
If SpaceAsPlus Then Space = "+" Else Space = "%20"
For i = 1 To StringLen
Char = Mid$(StringVal, i, 1)
CharCode = Asc(Char)
Select Case CharCode
Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
result(i) = Char
Case 32
result(i) = Space
Case 0 To 15
result(i) = "%0" & Hex(CharCode)
Case Else
result(i) = "%" & Hex(CharCode)
End Select
Next i
URLEncode = Join(result, "")
End If
End Function
然后,我在連接我的sXML字符串后調用此函數:
sXML = sXML & " <freeform_message>This is Tim's test message.</freeform_message>"
sXML = sXML & "</pnet_imessage_send>"
sXML = "service=imessage_send&xml=" & URLEncode(sXML, False)
它就像一個魅力!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.