VB.NET:如何从TcpClient获取的HTTP响应中移除表头表尾提取XML
问题场景
通过TcpClient获取到multipart/form-data格式的HTTP 1.1响应,需要提取其中的XML内容。目前已实现移除响应表头的逻辑,但无法通用移除结尾的multipart结束分隔线(类似---------------------------7e13971310878--),需要一套不依赖固定字符串的通用处理方案。
原始响应示例:
POST /test HTTP/1.1 Accept: */* Content-Length: 3644 Content-Type: multipart/form-data; boundary=-------------------------7e13971310878 Host: 192.168.1.103:123 User-Agent: cpp-httplib/0.9 ---------------------------7e13971310878 Content-Disposition: form-data; name="AE31172988786444323443"; filename="anpr.xml" Content-Type: application/xml Content-Length: 3417 <?xml version="1.0" encoding="utf-8"?> <EventNotificationAlert version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema"> <ipAddress>192.168.1.64</ipAddress> <ipv6Address>::</ipv6Address> <protocol>HTTP</protocol> ... </EventNotificationAlert> ---------------------------7e13971310878--
已实现的表头移除VB.NET代码:
Dim HTTPHeaderDelimiter As String = "<?xml version=""1.0"" encoding=""utf-8""?>" & vbCrLf If dati.IndexOf("<?xml version=""1.0"" encoding=""utf-8""?>") > -1 Then dati = dati.Substring(dati.IndexOf(HTTPHeaderDelimiter) + HTTPHeaderDelimiter.Length) End If
通用解决方案
针对结尾分隔线的移除,提供两种通用思路:
思路1:基于XML结构定位
XML内容的结束标志是根节点的闭合标签,可通过定位该标签来截取有效内容:
- 如果根节点固定(比如示例中的
EventNotificationAlert),直接定位闭合标签:
Dim xmlEndTag As String = "</EventNotificationAlert>" & vbCrLf If dati.IndexOf(xmlEndTag) > -1 Then Dim endIndex As Integer = dati.IndexOf(xmlEndTag) + xmlEndTag.Length dati = dati.Substring(0, endIndex) End If
- 如果根节点不固定,先通过XML解析器获取根节点名称,再定位闭合标签,适配所有XML结构:
Try Dim xmlDoc As New XmlDocument() ' 临时截取到第一个空行前的内容,避免尾部无效字符导致解析失败 xmlDoc.LoadXml(dati.Substring(0, dati.IndexOf(vbCrLf & vbCrLf))) Dim rootEndTag As String = "</" & xmlDoc.DocumentElement.Name & ">" If dati.IndexOf(rootEndTag) > -1 Then Dim endIndex As Integer = dati.IndexOf(rootEndTag) + rootEndTag.Length ' 保留标签后的换行(如果存在) If dati.Length > endIndex AndAlso dati.Substring(endIndex, 2) = vbCrLf Then endIndex += 2 End If dati = dati.Substring(0, endIndex) End If Catch ex As Exception ' 处理XML解析异常,如无效格式等 End Try
思路2:基于multipart边界特征匹配
根据RFC规范,multipart结束边界的特征是:以--结尾,前缀为一串-加随机标识,且通常位于空行之后。用正则表达式匹配该特征并移除:
Imports System.Text.RegularExpressions ' 匹配符合规范的multipart结束分隔线:换行 + 至少2个- + 随机字符 + --结尾 Dim regex As New Regex(vbCrLf & "-{2,}[a-zA-Z0-9]+?--$", RegexOptions.Singleline) dati = regex.Replace(dati, "")
该正则能适配不同长度的分隔线前缀和随机标识,无需提前知晓具体边界字符串。
内容的提问来源于stack exchange,提问作者Gabriele Cozzolino
相关产品推荐
相关产品推荐

