我有一个非常基本的linq查询,可以从xml文件中删除一个节点。但是当我运行这段代码时,我会在下面得到这个例外。
Sequence contains no elements
然后我使用了FirstOrDefault()而不是First()(如前面提到的那样)并且这次执行消息变成了这个
Object reference not set to an instance of an object.
这是我的代码
protected void Page_Load(object sender, EventArgs e)
{
XDocument doc = XDocument.Load(Server.MapPath("Kitaplar.xml"));
var toDelete = (from data in doc.Elements("Kitap") where data.Attribute("id").Value == "1" select data).FirstOrDefault();
toDelete.Remove();
doc.Save(Server.MapPath("Kitaplar.xml"));
}
这是xmlfile
<?xml version="1.0" encoding="utf-8"?>
<Kitaplar>
<Kitap id="1">
<Kitapadi>asasa</Kitapadi>
<Yazar>sasas</Yazar>
<Sayfa>22</Sayfa>
</Kitap>
<Kitap id="2">
<Kitapadi>jhjh</Kitapadi>
<Yazar>kjkj</Yazar>
<Sayfa>33</Sayfa>
</Kitap>
<Kitap id="3">
<Kitapadi>lkjhg</Kitapadi>
<Yazar>gffd</Yazar>
<Sayfa>988</Sayfa>
</Kitap>
<Kitap id="4">
<Kitapadi>lkjhg</Kitapadi>
<Yazar>gffd</Yazar>
<Sayfa>988</Sayfa>
</Kitap>
</Kitaplar>
对我来说一切都很好。我做错了什么?
答案 0 :(得分:1)
我冒昧地编写了一个获取文件,元素和ID的方法;然后相应地删除元素。
private bool DeleteRowWithID(string fileName, string element, string id)
{
XDocument doc = XDocument.Load(fileName);
if (doc.Root == null)
return false;
XElement toRemove = doc.Root.Elements(element).Where(e => e.Attribute("id").Value == id).FirstOrDefault();
if (toRemove == null)
return false;
toRemove.Remove();
doc.Save(fileName);
return true;
}
上面的方法将XmlDocument加载到XDocument(允许LINQ to XML)中。它会检查root是否为空,然后找到您指定的元素。
检查元素是否存在;然后从文档中删除该元素,并保存已删除的内容。
最后,它返回true表示该元素实际上已被删除。
如果您只想要元素并坚持使用您的方法,请使用以下内容:
XElement toRemove = doc.Root.Elements("Kitap").Where(e => e.Attribute("id").Value == "1").FirstOrDefault();