【问题标题】:Parse and query SOAP in C#在 C# 中解析和查询 SOAP
【发布时间】:2009-08-12 11:00:16
【问题描述】:

我正在尝试解析一个重命名空间的 SOAP 消息(也可以找到源代码 here):

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Header>
  <ns1:TransactionID soapenv:mustUnderstand="1" xsi:type="xsd:string" xmlns:ns1="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2">0a00f556419041c08d8479fbaad02a3c</ns1:TransactionID>
 </soapenv:Header>
 <soapenv:Body>
  <SubmitRsp xmlns="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2">
   <MM7Version>5.3.0</MM7Version>
   <Status>
    <StatusCode xsi:type="ns2:responseStatusType_StatusCode" xmlns:ns2="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" xmlns="">1000</StatusCode>
    <StatusText xsi:type="ns3:statusTextType" xmlns:ns3="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" xmlns="">Success</StatusText>
   </Status>
   <MessageID>B08CF7B847DAD89C752334BDEBB69B5B</MessageID>
  </SubmitRsp>
 </soapenv:Body>
</soapenv:Envelope>

就上下文而言,这是MM7 Submit消息的响应。

如何获得以下值:

TransactionID、StatusCode、StatusText、MessageID

我尝试了 Linq-Xml,但当查询包含“soapenv:Body”之类的值时没有运气。

【问题讨论】:

  • 我很好奇。与其解析消息,不如使用服务引用?
  • 使用“添加服务引用”命令创建对返回此数据的服务的服务引用。然后你可以像方法一样调用它,并像带有属性的类一样处理元素。
  • 我知道这个选项,但该服务不提供wsdl或disco。
  • 感谢您发布 XML。我浏览了 www.3gpp.org 网站。我不会相信任何组织会在 2009 年说以下内容:“此参考点应基于 SOAP 1.1 [68] 和使用 HTTP 传输层的带有附件的 SOAP 消息 [69]。未来版本 可能更新此协议决定以使用标准化版本的 SOAP 并支持额外的传输层实现。”这可能是我第一次看到一个组织故意使用非标准 SOAP。

标签: c# parsing soap xml-namespaces mm7


【解决方案1】:

如果您尝试使用命名空间构建 XName,您需要从 XNamespace 加上字符串构建它,例如

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
XName body = soapenv + "Body";

然后,当您将 XName "body" 与 Linq-to-XML 一起使用时,它将匹配您文档中的 &lt;soapenv:Body&gt; 元素。

您可以做类似的事情来允许使用命名空间构建其他元素的名称。

【讨论】:

    【解决方案2】:

    还有一种更简单的方法。您可以使用 {} 表示法简单地指定命名空间:

    var soap = XElement.Load(soapPath);
    var transactionID = 
            from e in soap.Descendants("{http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2}TransactionID")
            select e.Value;
    

    【讨论】:

      【解决方案3】:

      我认为您需要使用 XmlDocument(用于读取 XML)和 XmlNamespaceManager(用于检索命名空间数据)并使用来自这些对象的 XPath 查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-18
        • 2016-01-11
        • 2020-12-11
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多