代码之家  ›  专栏  ›  技术社区  ›  Ron Klein Noa Kuperberg

用C语言解析和查询SOAP#

  •  2
  • Ron Klein Noa Kuperberg  · 技术社区  · 15 年前

    我正试图解析一个有着很重的名称空间的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提交

    如何获取以下值:

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

    我尝试了LINQXML,但当查询包含像“soapenv:Body”这样的值时没有成功。

    3 回复  |  直到 9 年前
        1
  •  3
  •   Greg Beech    15 年前

    如果你想建立一个 XName 对于名称空间,您需要从 XNamespace 加上一个字符串,例如。

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

    那么当你使用 XName body “使用Linq to XML,它将与 <soapenv:Body> 元素。

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

        2
  •  3
  •   Winston Smith    15 年前

    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
  •  0
  •   Russell    15 年前

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