2014-06-22 51 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();