You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:17:05