[英]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.