2014-06-22 26 views
2

我有一个非常基本的LINQ查询,以便能够从XML file.But删除一个节点,当我运行这段代码,我在下面得到这个例外。广东话删除的XmlElement使用LINQ查询

Sequence contains no elements 

然后我用,而不是首先()(如前面提到的文章)FirstOrDefault(),这个时候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> 

每个人看起来都很好,我做错了什么?

+0

调试。 'doc'是否填满了实际的文件? – Matthijs

+1

在doc.Root.Elements(...)中的数据中使用'''doc'变量指向文档表示,其第一个元素是'Kitaplar'节点(根元素) –

+0

你是对的jimmy。它的工作原理是这样的。@Matthijs感谢你的帮助 – user3733078

回答

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; 
    } 

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

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

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

如果你只是想要的元素,并坚持你的方法,使用以下方法:通过你们的节目

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