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

VB.NET中无法拆分自动生成的SOAP XML数据问题求助

在VB.NET中拆分SOAP XML数据的解决方案

首先,先把你提供的XML内容贴出来方便参考:

<?xml version="1.0" encoding="UTF-8"?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
        <ns2:genelSorguResponse xmlns:ns2="http://genel.service.ws.epvys.g222.tubitak.gov.tr/"> 
            <return> 
                <PetrolPiyasasiIllereGoreAkaryakitFiyatlariResult> 
                    <PetrolPiyasasiIllereGoreAkaryakitFiyatlari> 
                        <Tarih>2018-04-28 00:00:00.0</Tarih> 
                        <YakitTipi>Kurşunsuz...</YakitTipi> 
                    </PetrolPiyasasiIllereGoreAkaryakitFiyatlari> 
                </PetrolPiyasasiIllereGoreAkaryakitFiyatlariResult> 
            </return> 
        </ns2:genelSorguResponse> 
    </S:Body> 
</S:Envelope>

这份XML是标准的SOAP响应格式,核心问题在于命名空间的处理——很多人忽略这一步导致节点找不到。下面是两种常用的VB.NET处理方案,你可以根据自己的习惯选择:

方案一:使用LINQ to XML(XDocument)

这是比较现代简洁的方式,推荐优先使用:

Imports System.Xml.Linq

' 加载XML内容(你可以从文件、字符串或流加载,这里用字符串示例)
Dim xmlContent As String = "你的XML字符串内容"
Dim doc As XDocument = XDocument.Parse(xmlContent)

' 声明XML中用到的命名空间
Dim soapNs As XNamespace = "http://schemas.xmlsoap.org/soap/envelope/"
Dim ns2 As XNamespace = "http://genel.service.ws.epvys.g222.tubitak.gov.tr/"

' 定位到目标节点集合
Dim fiyatNodes = doc.Descendants(soapNs + "Body") _
                    .Descendants(ns2 + "genelSorguResponse") _
                    .Descendants("return") _
                    .Descendants("PetrolPiyasasiIllereGoreAkaryakitFiyatlariResult") _
                    .Descendants("PetrolPiyasasiIllereGoreAkaryakitFiyatlari")

' 遍历每个节点提取数据
For Each node In fiyatNodes
    Dim tarih As String = node.Element("Tarih").Value
    Dim yakitTipi As String = node.Element("YakitTipi").Value
    
    ' 这里可以把数据存到对象、列表或者做其他处理
    Console.WriteLine($"日期:{tarih},燃油类型:{yakitTipi}")
Next

关键说明:

  • 必须用XNamespace来声明XML里的命名空间(S:和ns2:对应的URL),否则无法匹配到带命名空间的节点。
  • Descendants方法可以逐层向下查找节点,也可以直接用XPathSelectElements结合命名空间管理器来查找,看你习惯。

方案二:使用XmlDocument(传统DOM方式)

如果你更习惯传统的XmlDocument操作,也可以这样写:

Imports System.Xml

Dim xmlContent As String = "你的XML字符串内容"
Dim doc As New XmlDocument()
doc.LoadXml(xmlContent)

' 创建命名空间管理器
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("S", "http://schemas.xmlsoap.org/soap/envelope/")
nsmgr.AddNamespace("ns2", "http://genel.service.ws.epvys.g222.tubitak.gov.tr/")

' 用XPath查找目标节点
Dim nodeList As XmlNodeList = doc.SelectNodes("//S:Body/ns2:genelSorguResponse/return/PetrolPiyasasiIllereGoreAkaryakitFiyatlariResult/PetrolPiyasasiIllereGoreAkaryakitFiyatlari", nsmgr)

' 遍历提取数据
For Each node As XmlNode In nodeList
    Dim tarih As String = node.SelectSingleNode("Tarih").InnerText
    Dim yakitTipi As String = node.SelectSingleNode("YakitTipi").InnerText
    
    Console.WriteLine($"日期:{tarih},燃油类型:{yakitTipi}")
Next

关键说明:

  • 使用XmlNamespaceManager来管理命名空间,XPath查询时必须带上命名空间前缀(比如S:、ns2:)才能正确找到节点。
  • 如果XML里有多个PetrolPiyasasiIllereGoreAkaryakitFiyatlari节点,这段代码会自动遍历所有节点,不用担心遗漏。

不管用哪种方式,核心都是正确处理命名空间——这是SOAP XML处理的常见坑,搞定这一步之后,提取数据就很简单啦!

内容的提问来源于stack exchange,提问作者umadik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:15:51