简体   繁体   English

在C#中解析PayPal SOAP响应

[英]Parsing PayPal SOAP response in C#

How do you parse this XML file? 您如何解析此XML文件? I need to get Ack and Token values 我需要获取Ack和Token值

I've tried 我试过了

XmlDocument doc = new XmlDocument()
doc.LoadXml(xml)
XmlNode Ack = doc.DocumentElement.SelectSingleNode("//Ack")
XmlNode Token = doc.DocumentElement.SelectSingleNode("//Token")

My xml string is good as below, but Ack and Token are null. 我的xml字符串如下所示,但Ack和Token为空。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cc="urn:ebay:apis:CoreComponentTypes" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:ed="urn:ebay:apis:EnhancedDataTypes" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" xmlns:ns="urn:ebay:api:PayPalAPI">
  <SOAP-ENV:Header>
    <Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext" xsi:type="wsse:SecurityType"></Security>
    <RequesterCredentials xmlns="urn:ebay:api:PayPalAPI" xsi:type="ebl:CustomSecurityHeaderType">
      <Credentials xmlns="urn:ebay:apis:eBLBaseComponents" xsi:type="ebl:UserIdPasswordType">
        <Username xsi:type="xs:string"></Username>
        <Password xsi:type="xs:string"></Password>
        <Signature xsi:type="xs:string"></Signature>
        <Subject xsi:type="xs:string"></Subject>
      </Credentials>
    </RequesterCredentials>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body id="_0">
    <SetExpressCheckoutResponse xmlns="urn:ebay:api:PayPalAPI">
      <Timestamp xmlns="urn:ebay:apis:eBLBaseComponents">2015-10-09T21:21:39Z</Timestamp>
      <Ack xmlns="urn:ebay:apis:eBLBaseComponents">Success</Ack>
      <CorrelationID xmlns="urn:ebay:apis:eBLBaseComponents">fsfsd8d6bb</CorrelationID>
      <Version xmlns="urn:ebay:apis:eBLBaseComponents">112</Version>
      <Build xmlns="urn:ebay:apis:eBLBaseComponents">18sdf778</Build>
      <Token xsi:type="ebl:ExpressCheckoutTokenType">EC-6YBsdfs24894B</Token>
    </SetExpressCheckoutResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

If you are interacting with soap services you might want to add a service reference and have it create proxy classes for you. 如果要与肥皂服务进行交互,则可能需要添加服务引用并使其为您创建代理类。

Using Linq to XML you can do something like the below 使用Linq到XML,您可以执行以下操作

    var parsedSoap = XElement.Parse(soapMessage);
    XNamespace  payPalResponseNs ="urn:ebay:api:PayPalAPI";
    XNamespace resultingResponseNs = "urn:ebay:apis:eBLBaseComponents";
    parsedSoap.Descendants()
              .Where(x=> x.Name == payPalResponseNs+"SetExpressCheckoutResponse")
              .Select(x=> new 
                    {
                        Timestamp = x.Element(resultingResponseNs +"Timestamp")?.Value,
                        Ack = x.Element(resultingResponseNs +"Ack")?.Value,
                        CorrelationID = x.Element(resultingResponseNs +"CorrelationID")?.Value,
                        Version = x.Element(resultingResponseNs +"Version")?.Value,
                        Build = x.Element(resultingResponseNs +"Build")?.Value,
                        Token = x.Element(payPalResponseNs +"Token")?.Value
                    }
                    );

Or Better yet 还是更好

  XmlDocument doc = new XmlDocument(); XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); mgr.AddNamespace("PayPalAPI", "urn:ebay:api:PayPalAPI"); mgr.AddNamespace("eBLBaseComponents", "urn:ebay:apis:eBLBaseComponents"); doc.LoadXml(xml); XmlNode Ack = doc.SelectSingleNode("//eBLBaseComponents:Ack", mgr); XmlNode node = doc.SelectSingleNode("//PayPalAPI:SetExpressCheckoutResponse", mgr); string strAck = null; if (Ack != null) strAck = Ack.InnerText.ToLower(); if (strAck != null && (strAck == "success" || strAck == "successwithwarning")) { //token = decoder["TOKEN"]; foreach (XmlNode child in node.ChildNodes) { if (child.Name.ToLower() == "token") { token = child.InnerText; } } } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM