c#
  • linq-to-xml
  • xelement
  • 2012-01-16 97 views 1 likes 
    1

    我試圖從XElement (使用.Remove())刪除後代元素,我似乎得到一個空對象引用,我不知道爲什麼。根據屬性值從XML中刪除元素?

    說完看着前面的問題與這個稱號see here,我找到了一種方法來刪除它,但我仍然不明白爲什麼我第一次嘗試沒有工作的方式。

    有人能夠啓發我嗎?

    String xml = "<things>" 
          + "<type t='a'>" 
          + "<thing id='100'/>" 
          + "<thing id='200'/>" 
          + "<thing id='300'/>" 
          + "</type>" 
          + "</things>"; 
    
        XElement bob = XElement.Parse(xml); 
    
        // this doesn't work... 
        var qry = from element in bob.Descendants() 
          where element.Attribute("id").Value == "200" 
          select element; 
        if (qry.Count() > 0) 
        qry.First().Remove(); 
    
        // ...but this does 
        bob.XPathSelectElement("//thing[@id = '200']").Remove(); 
    

    感謝, 羅斯

    回答

    2

    的問題是,你是迭代集合包含不具備id屬性的一些元素。對他們來說,element.Attribute("id")null,所以試圖訪問Value屬性會拋出NullReferenceException。要解決這個

    一種方法是使用a cast而不是Value

    var qry = from element in bob.Descendants() 
          where (string)element.Attribute("id") == "200" 
          select element; 
    

    如果一個元素沒有id屬性,劇組將返回null,在這裏工作得很好。

    而且,如果您正在進行演員陣容,則可以將其轉換爲int?(如果需要)。

    +0

    謝謝svick,我明白了現在的問題。 – 2012-01-16 10:26:17

    1

    嘗試以下操作:

    var qry = bob.Descendants() 
           .Where(el => el .Attribute("id") != null) 
           .Where(el => el .Attribute("id").Value = "200") 
    
        if (qry.Count() > 0) 
        qry.First().Remove(); 
    

    你需要獲取其值之前測試的id屬性的存在。

    +0

    感謝您的有用建議。檢查屬性 - 我明白了爲什麼它根據svick的回答有關。 – 2012-01-16 10:22:35

    +0

    @BlackLight哦,值得一試! – ColinE 2012-01-16 10:23:49

    +0

    那麼,沒有進攻,但它已經超過三年了,我真的很驚訝沒有人看到這個代碼中的任何錯誤。有3個非常明顯的錯誤。 'el .Attribute'有兩個空格和'Attribute(「id」)。值=「200」'應該是'Attribute(「id」)。Value ==「200」'。注意double =符號。 – 2015-02-14 16:44:30

    相關問題