0

I have below XML.

  <Bd>
  <GEvt ZipCode="xyz" EvtDtm="2020-03-12T02:26:35+01:00"></GEvt>
  <GEvt ZipCode="abc" EvtDtm="2020-03-12T02:32:35+01:00"></GEvt>
  <GEvt ZipCode="def" EvtDtm="2020-03-12T02:34:35+01:00"></GEvt>
  </Bd>

I dont need first two. I only need the last one;

<GEvt ZipCode="def" EvtDtm="2020-03-12T02:34:35+01:00"></GEvt>

Here is my code;

  var lineItemDetails = xdoc.Root?.Descendants("Bd");

  foreach (var lineItemDetail in lineItemDetails?.Nodes().OfType<XElement>())
    {
    var ZipCode = lineItemDetail?.Attribute("ZipCode")?.Value;
    var EvtDtm = lineItemDetail?.Attribute("EvtDtm")?.Value;
    Console.WriteLine(ZipCode);
    Console.WriteLine(EvtDtm);
    }

It's working fine but it's returning all 3 values from XML. However i only need the last one. I tried to use Last() but it didnt work. Using Last() bringing me last character. I need only this;

<GEvt ZipCode="def" EvtDtm="2020-03-12T02:34:35+01:00"></GEvt>

How to achieve it? What am i missing?

thatthing
  • 676
  • 3
  • 15
  • 39

1 Answers1

2

Check it out. It finds last <GEvt.../> XML element based on its position.

c#

void Main()
{
    const string GEVT = "GEvt";
    const string ZIPCODE = "ZipCode";
    const string EVTDTM = "EvtDtm";

    XElement xml = XElement.Parse(@"<Bd>
        <GEvt ZipCode='xyz' EvtDtm='2020-03-12T02:26:35+01:00'></GEvt>
        <GEvt ZipCode='abc' EvtDtm='2020-03-12T02:32:35+01:00'></GEvt>
        <GEvt ZipCode='def' EvtDtm='2020-03-12T02:34:35+01:00'></GEvt>
        </Bd>");

    // get desired XML element
    XElement lastElement = xml.Elements(GEVT).Last();

    // get attributes values
    string Zipcode = lastElement.Attributes(ZIPCODE).FirstOrDefault().Value;
    string EvtDtm = lastElement.Attributes(EVTDTM).FirstOrDefault().Value;
}
Yitzhak Khabinsky
  • 18,471
  • 2
  • 15
  • 21