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);
}
答案 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())