Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用Linq查询删除XmlElement_C#_Linq_Linq To Xml - Fatal编程技术网

C# 无法使用Linq查询删除XmlElement

C# 无法使用Linq查询删除XmlElement,c#,linq,linq-to-xml,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) { XDo

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

    }
这是XML文件

<?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>

阿萨萨
萨萨斯
22
jhjh
kjkj
33
lkjhg
gffd
988
lkjhg
gffd
988

在我看来一切正常。我做错了什么?

我冒昧地编写了一个方法,该方法使用文件、元素和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转换为XML)。它检查根是否为空,然后查找指定的元素

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

最后,它返回true以指示元素实际上已被删除

如果只需要元素并坚持使用方法,请使用以下方法:

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

通过程序进行调试。
doc
是否用实际文件填充?使用doc.Root.Elements(…中的数据中的
doc
变量指向文档表示,它的第一个元素是
Kitaplar
节点(根元素)。你说得对。它是这样工作的。@Matthijs感谢你的帮助