使用where子句从父级删除子XML节点

时间:2014-01-03 17:45:22

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

LINQ和XML真的很新。我希望有人可以告诉我在尝试从XElement中删除子节点时我做错了什么。

以下是我的XML示例: (我试图删除与用户选择的关系对应的“关系”)

<Bill>
  <Element>
    <Name>AccountNumber</Name>
    <Regex></Regex>
    <Left></Left>
    <Right></Right>
    <Top></Top>
    <Bottom></Bottom>
    <Index>0</Index>
    <Relations></Relations>
  </Element>
  <Element>
    <Name>BillDate</Name>
    <Regex></Regex>
    <Left></Left>
    <Right></Right>
    <Top></Top>
    <Bottom></Bottom>
    <Index>1</Index>
    <Relations>
      <Relation>AccountNumber.RightOf.Right.0</Relation>
      <Relation>AccountNumber.Below.Top.-10</Relation>
      <Relation>AccountNumber.Above.Bottom.-10</Relation>
    </Relations>
  </Element>

如果我的WPF GUI,当用户点击关系上的删除时,我想只删除父关系中的那个关系。

这是我尝试过的很多事情之一:

private void DeleteButton_Click(object sender, RoutedEventArgs e)
{
    List<RelationsDetailView> details = (List<RelationsDetailView>)DetailsView.ItemsSource;

    XElement parentElement = (from Node in ocrVar.Xml.Descendants("Element")
                              where Node.Element("Index").Value == ocrVar.SelectedItem.Index.ToString()
                              select Node).FirstOrDefault();
    XElement child = parentElement.Element("Relations").Elements("Relation").Where(xel => xel.Element("Relation").Value == (details[DetailsView.SelectedIndex].Relation)).FirstOrDefault();
    child.Remove();
    ocrVar.Xml.Save(ocrVar.xmlPath);
}

2 个答案:

答案 0 :(得分:3)

您的Where谓词不正确。 xel已经是<relation>元素,因此您无需再次致电Element("Relation")

您还应将XElement.Value替换为(string)XElement以阻止NullReferenceException

.Where(xel => (string)xel == (details[DetailsView.SelectedIndex].Relation))

或者您可以将FirstOrDefault与谓词而不是Where().FirstOrDefault()链一起使用:

XElement child = parentElement.Element("Relations").Elements("Relation").FirstOrDefault(xel => (string)xel == details[DetailsView.SelectedIndex].Relation);

答案 1 :(得分:2)

xel.Element("Relation").Value == (details[DetailsView.SelectedIndex].Relation

这个条件总是返回false,也许你想要这样的东西?

(string)xel.Element("Relation") == (details[DetailsView.SelectedIndex].Relation.ToString())