开发者

lambda expression in LINQ to XML

开发者 https://www.devze.com 2023-04-02 20:00 出处:网络
Please check my code - XML- <LocalXML> <PnrDetails SearchType=\"Outbound\"> <GDSPNR></GDSPNR>

Please check my code - XML-

 <LocalXML>
  <PnrDetails SearchType="Outbound">
    <GDSPNR></GDSPNR>
  </PnrDetails>
  <PnrDetails SearchType="Inbound">
    <GDSPNR></GDSPNR>
  </PnrDetails>
</LocalXML>

Code -

XDocument doc = XDocument.Load(@"RSP.xml");
            var ele = doc.Root.Elements("PnrDetails");
            foreach (XElement e in ele)
            {
                if (e.Element("GDSPNR").Value.Equals(""))
                {
                    e.Elements().Remove();
                    e.Add(new XElement("ErrorMessage", "Booking is not confirmed")
                    );
                }
            }

My code is working fine.Now my question is that can I use Lambda Expression in above code to check whether GDSPNR value null or not.If yes then please tell me how?

Thanks in advance.

EDIT XML -

<LocalXML>
  <PnrDetails SearchType="Outbound">
    <GDSPNR></GDSPNR>
    <SPNR>abc</SPNR>
  开发者_JAVA技巧  <DSPNR>xyz</DSPNR>
  </PnrDetails>
  <PnrDetails SearchType="Inbound">
    <GDSPNR></GDSPNR>
    <SPNR>abx</SPNR>
    <DSPNR>cds</DSPNR>
  </PnrDetails>
</LocalXML>


How about this (based entirely on what your current logic is doing):

    IEnumerable<XElement> nodesToBeReplaced = document.Root
        .Elements("PnrDetails")
        .Descendants("GDSPNR")
        .Where(element => element.Value.Equals(string.Empty));

    foreach (XElement element in nodesToBeReplaced)
    {
        element.Name = "ErrorMessage";
        element.Value = "Booking is not confirmed";
    }

If instead you mean, PnrDetails without a child tag of GDSPNR, like this:

  <PnrDetails SearchType=""Outbound"">
  </PnrDetails>

Then you can do the following:

    IEnumerable<XElement> nodesWithMissingChildElements = document.Root
        .Elements("PnrDetails")
        .Where(element => !element.Descendants("GDSPNR").Any());


My suggestion:

    XDocument doc = XDocument.Load(@"RSP.xml");
    var ele = doc.Root.Elements("PnrDetails");
    foreach (XElement e in ele.Where(e => string.IsNullOrEmpty((string)e.Element("GDSPNR"))))
    {
      e.Elements().Remove();
      e.Add(new XElement("ErrorMessage", "Booking is not confirmed"));
    }


Well what would you consider a "null" check for an XML element node? Your current code checks whether the Value property is an empty string, if all you want to do is move the check of the if statement up into your query expression then do e.g.

  var ele = doc.Root.Elements("PnrDetails").Where(p => p.Element("GDSPNR").Value == "");

Or do you want to check whether there is a child element GDSPNR at all:

  var ele = doc.Root.Elements("PnrDetails").Where(p => p.Element("GDSPNR") != null);
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号