简体   繁体   中英

Using c# to read XML that has nested namespaces

I am trying to extract the following values from this XML using C#.

Messages - the inntertext
success ="true" - just the "true" bit
status ="Released" - just the "Released" bit

Namespaces are clearly the issue here - but I can't get it right. Can someone provide an example of parsing this file here please?


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <tns:executeCreateLoanIncreaseResponse xmlns:tns="http://api.ws.liq.pisys.com/">
      <CreateLoanIncreaseResponse success="true">
        <OutstandingTransactionAsReturnValue version="1.0" alias="LIBRLC" status="Released" id="5CJB6GS"></OutstandingTransactionAsReturnValue>
        <Messages>
          <Message>CreateLoanIncrease&gt;&gt;Effective date current business date (08-Sep-2016).</Message>
          <Message>CreateLoanIncrease&gt;&gt;Intent Notices have not been generated.</Message>
          <Message>CreateLoanIncrease&gt;&gt;You are about to release this increase.</Message>
        </Messages>
      </CreateLoanIncreaseResponse>
    </tns:executeCreateLoanIncreaseResponse>
  </soapenv:Body>
</soapenv:Envelope>

Try xml linq :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement messages = doc.Descendants().Where(x => x.Name.LocalName == "Messages").FirstOrDefault();
            XNamespace ns = messages.GetDefaultNamespace();

            List<string> strMessages = messages.Elements(ns + "Message").Select(x => (string)x).ToList();
        }
    }
}

You can use Linq2Xml and XPath

var xDoc = XDocument.Load(filename);

var success = (bool)xDoc.XPathSelectElement("//CreateLoanIncreaseResponse").Attribute("success");
var status = (string)xDoc.XPathSelectElement("//OutstandingTransactionAsReturnValue").Attribute("status");
var messages = xDoc.XPathSelectElements("//Message").Select(x => (string)x.Value).ToList();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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