Newbie with XDocuments and Linq, please suggest a solution to retrieve the data from a particular tag in the xml string:
If I have a XML string from webservice response (I formatted xml for ease):
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetCashFlowReportResponse xmlns="http://tempuri.org/"> <GetCashFlowReportPdf>Hello!</GetCashFlowReportPdf> </GetCashFlowReportResponse> </soap:Body> </soap:Envelope>
Using the following code, I can get the value only if GetCashFlowReportResponse
tag doesn't have "xmlns"
attribute. Not sure why? Otherwise, it always return null.
string inputString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><GetCashFlowReportResponse xmlns=\"http://tempuri.org/\"><GetCashFlowReportPdf>Hello!</GetCashFlowReportPdf></GetCashFlowReportResponse></soap:Body></soap:Envelope>" XDocument xDoc = XDocument.Parse(inputString); //XNamespace ns = "http://tempuri.org/"; XNamespace ns = XNamespace.Get("http://tempuri.org/"); var data = from c in xDoc.Descendants(ns + "GetCashFlowReportResponse") select (string)c.Element("GetCashFlowReportPdf"); foreach (string val in data) { Console.WriteLine(val); }
I can't change the web service to remove that attribute. IS there a better way to read the response and get the actual data back to the user (in more readable form)?
Edited: SOLUTION:
XDocument xDoc = XDocument.Parse(inputString); XNamespace ns = "http://tempuri.org/"; var data = from c in xDoc.Descendants(ns + "GetCashFlowReportResponse") select (string)c.Element(ns + "GetCashFlowReportPdf"); foreach (string val in data) { Console.WriteLine(val); }
Note: Even if all the child elements doesn't have the namespace attribute, the code will work if you add the "ns" to the element as I guess childs inherit the namespace from parent (see response from SLaks).
You need to include the namespace:
XNamespace ns = "http://tempuri.org/"; xDoc.Descendants(ns + "GetCashFlowReportResponse")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With