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
相关产品推荐
相关产品推荐

