【问题标题】:Deleting parent element using Linq to XML使用 Linq to XML 删除父元素
【发布时间】:2012-02-01 17:41:20
【问题描述】:

我有一个这样的 XML 文件

<BallList>
<Brand name="xyz">
    <BallName>ball A</BallName>
    <DateApproved>Jan-12</DateApproved>
    <link>www.a.com</link>
</Brand>
<Brand name="abc">
    <BallName>Ball B</BallName>
    <DateApproved>Jan-02</DateApproved>
    <link>www.b.com</link>
</Brand>
</BallList>

这样就有大约 150 个品牌和 8000 个球名。我知道这不是表示 XML 的好方法,但是现在由于数据巨大,无法修改结构。

我需要通过将“品牌”节点与其球名进行比较来删除它

这是我正在尝试的代码:

XElement doc = XElement.Load(Server.MapPath("NetBalls.xml"));
doc.Elements("Brand")
   .Where(s => s.Attribute("name").Value == DropDownList1.SelectedItem.Text)
   .Elements("BallName")
   .Where(l => l.Value == textbox1.Text)
   .AncestorsAndSelf()
   .Remove();

我正在尝试搜索品牌并进入其元素节点并检查其节点并删除其父节点。

谁能帮我解决这个问题?

【问题讨论】:

    标签: c# linq c#-4.0 linq-to-xml


    【解决方案1】:

    无需向下导航到子节点并再次备份,只需将子级标准嵌入到Where 查询中,针对您实际需要的元素:

    doc.Elements("Brand")
       .Where(s => s.Attribute("name").Value == selectedBrand)
       .Where(s => s.Elements("BallName").Any(l => l.Value == selectedValue))
       .Remove();
    

    这样,您的 Linq 查询与您的英文查询更加匹配:“找到名称属性为 x 且 Ballname 元素为 y 的所有 Brand 元素,并将其删除。”

    【讨论】:

      【解决方案2】:

      您要删除品牌元素吗?试试这个:

      xml.Elements("Brand")
         .Where(s => s.Attribute("name").Value == DropDownList1.SelectedItem.Text)
         .Elements("BallName")
         .Where(l => l.Value == textbox1.Text)
         .Select(x => x.Parent)
         .Remove();
      

      这将删除所有符合条件的品牌元素。

      【讨论】:

        【解决方案3】:

        您可以在单个 where 子句中组合选择条件:

        doc.Elements("Brand")
            .Where(brand =>
                (string)brand.Attribute("name") == DropDownList1.SelectedItem.Text &&
                brand.Elements("BallName").Any(ballName => (string)ballName == textbox1.Text))
            .Remove();
        

        【讨论】:

          【解决方案4】:
           string brandName = "xyz";
           string ballName = "ball A";
           var brands = doc.Elements("Brand").Where(s => s.Attribute("name").Value == brandName);
           foreach (var brand in brands)
           {
               if(brand.Elements("BallName").Any(l => l.Value == ballName))
               {
                   brand.Remove();
               }
           }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-09
            • 1970-01-01
            相关资源
            最近更新 更多