不能使用Linq查询删除XmlElement

本文关键字:删除 XmlElement 查询 Linq 不能 | 更新日期: 2023-09-27 18:10:00

我有一个非常基本的linq查询,能够从xml文件中删除一个节点。但是当我运行这段代码时,我得到了下面的异常:

 Sequence contains no elements

然后我使用了FirstOrDefault()代替First()(如前面提到的帖子),这次Exection消息变成了这个

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>
在我看来一切都很好。我哪里做错了?

不能使用Linq查询删除XmlElement

我冒昧地写了一个方法,它接受文件、元素和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;
    }

上面的方法在XDocument中加载XmlDocument(允许LINQ到XML)。它检查根目录是否为空,然后找到您指定的元素。

检查元素是否存在;然后从文档中删除该元素,并保存已删除的内容。

最后,它返回true,表示该元素实际上已被删除。

如果你只是想要元素并坚持使用你的方法,使用以下命令:

XElement toRemove = doc.Root.Elements("Kitap").Where(e => e.Attribute("id").Value == "1").FirstOrDefault();