Почему этот запрос Linq to XML не работает - PullRequest
2 голосов
/ 14 сентября 2010
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xDocument = new XDocument(
                new XElement("BookParticipants",
                new XElement("BookParticipant",
                new XAttribute("type", "Author"),
                new XElement("FirstName", "Joe", new XElement("name", 
                    new XElement("noot", "the"),
                    new XElement("iscool", "yes"))),
                new XElement("LastName", "Rattz")),
                new XElement("BookParticipant",
                new XAttribute("type", "Editor"),
                new XElement("FirstName", "Ewan", new XElement("name", 
                    new XElement("noot", "the"),
                    new XElement("iscool", "yes"))),
                new XElement("LastName", "Buckingham"))));


            xDocument.Descendants("BookParticipants").Where(x => (string)x.Element("FirstName") == "Joe").Remove();
            Console.WriteLine(xDocument);

        }
    }
}

Я пытаюсь удалить элемент joe, используя предложение where.Но это не работает.Можно ли удалить элементы с помощью предложения where?

1 Ответ

3 голосов
/ 14 сентября 2010

РЕДАКТИРОВАТЬ: Хм ... я не знал об этом Remove метод расширения раньше.

Проблема в том, что при преобразовании элемента в строку он объединяет все нисходящие текстовые узлы ... поэтому значение элемента "Joe" на самом деле равно "Joe the still".

Вам нужны только direct дочерние текстовые узлы,Честно говоря, было бы проще, если бы имя было в атрибуте, а не в качестве содержимого, но оно все равно должно быть выполнимым ...

Кроме того, вы ищете элементы FirstName непосредственно под BookParticipants, а неBookParticipant.

Это работает, хотя это не очень приятно:

xDocument.Descendants("BookParticipants")
         .Elements()
         .Where(x => x.Elements("FirstName")
                      .Nodes()
                      .OfType<XText>()
                      .Any(t => t.Value== "Joe"))
         .Remove();

Вы можете изменить первый бит на

xDocument.Descendants("BookParticipant")
         .Where(...)

, если хотите, тоже.

(Опять же, если вы можете использовать атрибуты для строковых значений, а не содержимое в элементах, это облегчает жизнь.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...