C# 用C语言解析和查询SOAP#

C# 用C语言解析和查询SOAP#,c#,parsing,soap,xml-namespaces,mm7,C#,Parsing,Soap,Xml Namespaces,Mm7,我正在尝试解析一条名称空间很大的SOAP消息(也可以找到源代码): 0a00f556419041c08d8479fbaad02a3c 5.3.0 1000 成功 B08CF7B847DAD89C752334BDEB69B5B 就上下文而言,这是MM7提交消息的响应 如何获取以下值: TransactionID、状态代码、状态文本、消息ID 我尝试了Linq Xml,但在查询中包含“soapenv:Body”这样的值时没有成功。我认为您需要使用XmlDocument(用于读取Xml)和XmlN

我正在尝试解析一条名称空间很大的SOAP消息(也可以找到源代码):


0a00f556419041c08d8479fbaad02a3c
5.3.0
1000
成功
B08CF7B847DAD89C752334BDEB69B5B
就上下文而言,这是MM7提交消息的响应

如何获取以下值:

TransactionID、状态代码、状态文本、消息ID


我尝试了Linq Xml,但在查询中包含“soapenv:Body”这样的值时没有成功。

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

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

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
XName body = soapenv + "Body";
然后,当您将
XName
body
”与Linq to XML一起使用时,它将匹配文档中的
元素


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

还有一种更简单的方法。您只需使用{}表示法内联指定命名空间:

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;

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