如何读取SOAP XML中RetrieveFacsimileResult元素内的数据?
解决XML命名空间导致的XPath查询错误
你的问题出在XML包含命名空间,但XPath查询时未注册对应的命名空间管理器。以下是两种可行的解决方法:
方法一:使用XmlNamespaceManager配合XmlDocument
为XPath查询注册所需的命名空间,再执行查询:
XmlDocument MyDoc = new XmlDocument(); MyDoc.LoadXml(response.Content); // 初始化命名空间管理器,注册XML中用到的命名空间 XmlNamespaceManager nsManager = new XmlNamespaceManager(MyDoc.NameTable); // 注册soap前缀对应的命名空间 nsManager.AddNamespace("soap", "http://www.w3.org/2003/05/soap-envelope"); // 注册默认命名空间(RetrieveFacsimileResponse所在的命名空间),这里用ns作为前缀 nsManager.AddNamespace("ns", "http://cdr.ffiec.gov/public/services"); // 传入命名空间管理器执行XPath查询 XmlNode MyNode = MyDoc.SelectSingleNode("//soap:Envelope/soap:Body/ns:RetrieveFacsimileResponse/ns:RetrieveFacsimileResult", nsManager); // 获取元素内容 if (MyNode != null) { string facsimileData = MyNode.InnerText; // 后续处理逻辑 }
方法二:使用Linq to XML(更简洁)
如果项目支持.NET 3.5及以上版本,推荐用XDocument实现,无需额外管理命名空间前缀:
XDocument doc = XDocument.Parse(response.Content); // 定义XML中的命名空间 XNamespace soapNs = "http://www.w3.org/2003/05/soap-envelope"; XNamespace serviceNs = "http://cdr.ffiec.gov/public/services"; // 链式查询获取目标元素内容 string facsimileData = doc.Descendants(soapNs + "Body") .Elements(serviceNs + "RetrieveFacsimileResponse") .Elements(serviceNs + "RetrieveFacsimileResult") .FirstOrDefault()?.Value;
注意事项
- 注册的命名空间URI必须和XML中声明的完全一致,包括大小写和特殊字符
- 如果只需定位
RetrieveFacsimileResult元素,也可以用简化的XPath://ns:RetrieveFacsimileResult,直接跳过上层节点,提升查询效率
内容的提问来源于stack exchange,提问作者Tronics
相关产品推荐
相关产品推荐

