Удалить элемент из XML на основе значения атрибута? - PullRequest
1 голос
/ 16 января 2012

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

Посмотрев на предыдущий вопрос с таким названием ( см. Здесь ) , я нашел способ удалить его, но я до сих пор не понимаю, почему я попробовал первый не работал.

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

  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 ]

3 голосов
/ 16 января 2012

Проблема в том, что итерируемая коллекция содержит элемент, который не имеет атрибута id.Для них element.Attribute("id") - это null, поэтому попытка получить доступ к свойству Value выдает NullReferenceException.

. Один из способов решить эту проблему - использовать вместо этого приведение из Value:

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

Если элемент не имеет атрибута id, приведение вернет null, что прекрасно работает здесь.

И если вы 'выполняя приведение, вы также можете привести к int?, если хотите.

1 голос
/ 16 января 2012

Попробуйте следующее:

  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, прежде чем получить его значение.

...