Jason
Jason

Reputation: 371

LINQ to XML DOM (making a modifed Tree easily)

I'd like to delete the last element and put somthing else instead of it.

I made some imaginary codes (** IT IS NOT Working one**).

I want to re-use upper part of it, because they are too long and changing all the time.

How can I make real ones ?

Thanks !!

var orignalTREE = new XDocument(
    new XElement( "Root", new XAttribute("Id", "0"),
        new XElement( "One", new XAttribute("Id", "1"),
            new XElement( "Two", new XAttribute("Id", "2"),
                new XElement( "Three", new XAttribute("Id", "3"),
                    new XElement( "Four", new XAttribute("Id", "4"),
                        new XElement( "Five", new XAttribute("Id", "5"),
                            new XElement("Six", new XAttribute("Id", "6"),
                                new XElement("Seven", new XAttribute("Id", "7"),
                                    new XElement( "LAST", "It will be removed")
)))))))));

var extractedELMNT = orignalTREE.ElementsBeforeSelf("LAST");
orignalTREE.Descendants("LAST").Remove();

var modifiedTREE = new XDocument(
    new XElement(
        extractedELMNT.Select(x =>x),
            new XElement( "Modified", new XAttribute("Testing...")
)));
MessageBox.Show( "Removed\n\n" + orignalTREE.ToString() +"\n\n\n"+ 
                 "Recovered\n\n" + modifiedTREE.ToString());

[Add]

I'd like to change the result from This one;

<Root Id="0">
    <One Id="1">
        <Two Id="2">
            <Three Id="3">
                <Four Id="4">
                    <Five Id="5">
                        <Six Id="6">
                            <Seven Id="7">
                                <LAST>It will be removed</LAST>
                            </Seven>
                        </Six>
                    </Five>
                </Four>
            </Three>
        </Two>
    </One>
</Root>

to This one.

<Root Id="0">
    <One Id="1">
        <Two Id="2">
            <Three Id="3">
                <Four Id="4">
                    <Five Id="5">
                        <Six Id="6">
                            <Seven Id="7">
                                <Modified>Testing..</Modified>
                            </Seven>
                        </Six>
                    </Five>
                </Four>
            </Three>
        </Two>
    </One>
</Root>

In general ways.

Upvotes: 1

Views: 47

Answers (1)

Alexandr Kudryashov
Alexandr Kudryashov

Reputation: 631

try this: Updated:

var orignalTREE = new XDocument(
            new XElement("Root", new XAttribute("Id", "0"),
                new XElement("One", new XAttribute("Id", "1"),
                    new XElement("Two", new XAttribute("Id", "2"),
                        new XElement("Three", new XAttribute("Id", "3"),
                            new XElement("Four", new XAttribute("Id", "4"),
                                new XElement("Five", new XAttribute("Id", "5"),
                                    new XElement("Six", new XAttribute("Id", "6"),
                                        new XElement("Seven", new XAttribute("Id", "7"),
                                            new XElement("LAST", "It will be removed")
                                            )))))))));

        var modifiedTREE = new XDocument(orignalTREE);
        var parent = modifiedTREE.Descendants("LAST").FirstOrDefault().Parent;
        modifiedTREE.Descendants("LAST").Remove();
        parent.Add(new XElement("Modified", "Its attribute"));

        Console.WriteLine("Removed\n\n" + orignalTREE.ToString() + "\n\n\n" +
                          "Recovered\n\n" + modifiedTREE.ToString());

Upvotes: 1

Related Questions