无法使用Linq查询删除XmlElement

时间:2014-06-22 13:34:50

标签: c# linq linq-to-xml

我有一个非常基本的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>

对我来说一切都很好。我做错了什么?

1 个答案:

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