Zamiana elementu na atrybut w innym elemencie.

0

Witam,
W ramach ćwiczenia z C# przerabiam z wyprzedzeniem laboratoria i natknąłem się na problem, którego rozwiązania nie mogę znaleźć nawet na stacku. Jedyne pasujące wyniki jakie znalazłem dotyczyły root node, co mi nie pomaga i czego nie umiałem przełożyć na swój problem.

Moje zadanie to:

"Załadować dokument CarsCollection.xml, a następnie przeprowadzić na nim modyfikację w taki
sposób, aby
a) zmienić nazwę elementu horsePower na hp (0.5 pkt)
b) zamiast elementu year utworzyć atrybut o tej samej nazwie w elemencie model (0.5 pkt)"

CarsCollection.xml => http://ideone.com/7sdLfC

Podpunkt a) udało mi się zrobić po przewertowaniu stacka:

private void button6_Click(object sender, EventArgs e)
        {
            // podpunkt A
            XDocument input = XDocument.Load(Environment.CurrentDirectory + @"\CarsCollection.xml");
            input.Descendants("horsePower").ToList().ForEach(s => s.Name = "hp");
            input.Save(Environment.CurrentDirectory + @"\CarsCollection2.xml");
            webBrowser1.Navigate(Environment.CurrentDirectory + @"\CarsCollection2.xml");
        } 

Co do podpunktu b) to szukałem długo i nie mogę znaleźć nic co nie korzystało by z XSLT, ale jako że w treści laboratorium nie było o nim wspomniane to zastanawiam się czy jest jakiś sposób aby zrobić to bez XSLT? Tak jak pierwszy podpunkt? XSLT wydaje mi się być mało wygodnym rozwiązaniem. Kod na zmianę jednego elementu jest równie długi jak nie dłuższy od samej zawartości pliku .xml.

W skrócie: czy da się to zrobić, w jakiś szybszy lub po prostu inny sposób, niż korzystając z XSLT?

1

dla mnie sama manipulacja struktura XML wydaje sie bardzo slabym pomyslem, no ale ok. Jako cwiczenie...

idz po kazdym elemencie (zaczynajac od roota). Jezeli jakies dziecko zawiera element year to go usun a nastepnie dodaj atrybut do elementu model (w tym samym parencie!). Przelec tak cale drzewo

https://msdn.microsoft.com/en-us/library/mt693114.aspx
(reszte linkow sadze ze sobie znajdziesz bez problemow)

2

Wersja w LINQ (XElement):

			xml.Elements("car").Elements("engine").Elements("horsePower").ToList().ForEach(e => { e.Name = "hp"; });
			xml.Elements("car").ToList().ForEach(e => {
				var year = e.Element("year");
				e.Element("model").SetAttributeValue("year", year.Value);
				year.Remove();
			});

1 użytkowników online, w tym zalogowanych: 0, gości: 1