【问题标题】:lambda expression in LINQ to XMLLINQ to XML 中的 lambda 表达式
【发布时间】:2011-09-03 11:17:07
【问题描述】:

请检查我的代码 - 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")
                    );
                }
            }

我的代码工作正常。现在我的问题是,我可以在上面的代码中使用 Lambda 表达式来检查 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>

【问题讨论】:

    标签: xml lambda linq-to-xml


    【解决方案1】:

    这个怎么样(完全基于你当前的逻辑在做什么):

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

    如果您的意思是不带 GDSPNR 子标签的 PnrDetails,如下所示:

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

    然后您可以执行以下操作:

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

    【讨论】:

    • 在我的另一种情况下,我在 PnrDetails 元素中有多个节点。如果我使用你的代码,它只是替换 GDSPNR 节​​点。如果我想删除 PnrDeatils 属性中的所有节点并仅添加 ErrorMessage节点,我该怎么办?
    • 然后您可以返回父级并删除所有兄弟姐妹:nodesToBeReplaced.Select(x => x.Parent).Descendants().Where(x => x.Name != “GDSPNR”)。删除();。您还可以使用 NextNode 和 PreviousNode 来查找兄弟姐妹或将查询分成两部分 - 找到孩子出错的部分,删除兄弟姐妹,然后添加/替换 GDSPNR 元素
    【解决方案2】:

    我的建议:

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

    【讨论】:

      【解决方案3】:

      那么,您认为 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多