лямбда-выражение в LINQ to XML - PullRequest
0 голосов
/ 03 сентября 2011

Пожалуйста, проверьте мой код - XML-

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

код -

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")
                    );
                }
            }

Мой код работает нормально. Теперь мой вопрос заключается в том, могу ли я использовать лямбда-выражение в приведенном выше коде, чтобы проверить, является ли значение GDSPNR нулевым или нет. Если да, скажите, пожалуйста, как?

Заранее спасибо.

РЕДАКТИРОВАТЬ XML -

<LocalXML>
  <PnrDetails SearchType="Outbound">
    <GDSPNR></GDSPNR>
    <SPNR>abc</SPNR>
    <DSPNR>xyz</DSPNR>
  </PnrDetails>
  <PnrDetails SearchType="Inbound">
    <GDSPNR></GDSPNR>
    <SPNR>abx</SPNR>
    <DSPNR>cds</DSPNR>
  </PnrDetails>
</LocalXML>

Ответы [ 3 ]

1 голос
/ 03 сентября 2011

Как насчет этого (основываясь исключительно на том, что делает ваша текущая логика):

    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";
    }

Если вместо этого вы имеете в виду, PnrDetails без дочернего тега GDSPNR, например:

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

Тогда вы можете сделать следующее:

    IEnumerable<XElement> nodesWithMissingChildElements = document.Root
        .Elements("PnrDetails")
        .Where(element => !element.Descendants("GDSPNR").Any());
1 голос
/ 03 сентября 2011

Мое предложение:

    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"));
    }
0 голосов
/ 03 сентября 2011

Ну, что вы считаете "нулевой" проверкой для узла элемента XML? Ваш текущий код проверяет, является ли свойство Value пустой строкой, если все, что вам нужно сделать, это переместить проверку оператора if в выражение запроса, а затем выполнить, например,

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

Или вы хотите проверить, есть ли вообще дочерний элемент GDSPNR:

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