2012-01-16 3 views
1

Я пытался удалить элемент-потомк из XElement (используя .Remove()), и я, кажется, получаю ссылку на нулевой объект, и я не уверен, почему.Удалить элемент из XML на основе значения атрибута?

Взглянув на предыдущий вопрос с этим названием (see here), я нашел способ, чтобы удалить его, но я до сих пор не понимаю, почему так, как я попробовал 1-й не работал.

Может кто-нибудь просветить меня?

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

Спасибо, я вижу, что проблема сейчас. –

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

Спасибо за полезный совет re. проверка атрибутов - я понимаю, почему это актуально в свете ответа Свика. –

+0

@BlackLight, ну, это стоило попробовать! – ColinE

+0

Ну, не обижайтесь, но прошло уже три года, и я действительно удивлен, что в этом коде не было никаких ошибок. Есть 3 очень заметных ошибки. «el .Attribute» имеет пробел как раз, так и «Атрибут» («id»). Значение = «200» должно быть «Атрибут (« id »). Значение ==« 200 »вместо. Обратите внимание на знак double =. –

Смежные вопросы