LINQ to XML Newbie: перемещение узлов с одного узла на другой - PullRequest
4 голосов
/ 29 мая 2009

Привет!

У меня есть объект XElement, который содержит следующее:

<Root>
    <SubSections>
        <SubSection id="A">
            <Foo id="1">
                <Bar />
                <Bar />
                <Bar />
            </Foo>
            <Foo id="2">
                <Bar />
                <Bar />
            </Foo>
            <Foo id="3">
                <Bar />
            </Foo>
        </SubSection>
        <SubSection id="B">
            <Foo id="4">
                <Bar />
                <Bar />
                <Bar />
            </Foo>
            <Foo id="5">
                <Bar />
                <Bar />
            </Foo>
         </SubSection>
        <SubSection id="C">

        </SubSection>
    </SubSections>
</Root>

Я бы хотел переместить Фу 2 и 3 в подраздел с идентификатором «C», чтобы получить результат:

<Root>
    <SubSections>
        <SubSection id="A">
            <Foo id="1">
                <Bar />
                <Bar />
                <Bar />
            </Foo>
        </SubSection>
        <SubSection id="B">
            <Foo id="4">
                <Bar />
                <Bar />
                <Bar />
            </Foo>
            <Foo id="5">
                <Bar />
                <Bar />
            </Foo>
        </SubSection>
        <SubSection id="C">
            <Foo id="2">
                <Bar />
                <Bar />
            </Foo>
            <Foo id="3">
                <Bar />
            </Foo>
        </SubSection>
    </SubSections>
</Root>

Как лучше всего перенести разделы Foo "2" и "3" в подраздел "C"?

1 Ответ

4 голосов
/ 29 мая 2009

Вам нужно получить Foo разделы 2 и 3 с запросом вроде:

var foos = from xelem in root.Descendants("Foo")
           where xelem.Attribute("id").Value == "2" || xelem.Attribute("id").Value == "3"
           select xelem;

А затем повторите этот список и удалите их из родителей с помощью

xelem.Remove();

Затем просто добавьте их в правильный узел с помощью:

parentElem.Add(xelem);

В первом запросе вы получите оба раздела, затем удалите и добавите каждый в нужное место на дереве.

Вот полное решение:

var foos = (from xElem in xDoc.Root.Descendants("Foo")
                   where xElem.Attribute("id").Value == "2" || xElem.Attribute("id").Value == "3"
                   select xElem).ToList();

        var newParentElem = (from xElem in xDoc.Root.Descendants("SubSection")
                            where xElem.Attribute("id").Value == "C"
                            select xElem).Single();

        foreach(var xElem in foos)
        {
            xElem.Remove();
            newParentElem.Add(xElem);
        }

После этого ваш xDoc должен иметь правильное дерево.

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