Slettet bruger
07. juni 2008 - 17:30
Der er
21 kommentarer og 1 løsning
XML: Sortere child nodes
Hej eksperter, Hvordan sorterer jeg alle children til en bestemt node i et XmlDocument efter en attribute? F.eks. alle application-noder ud fra attribute description her: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <launch rememberpreviouslycheckedapplications="False" autolaunchdelay="10"> <application description="Notepad++" executable="C:\\Programmer\\Notepad++\\notepad++.exe" checkedbydefault="False" /> <application description="Paint" executable="C:\\Program Files\\CoolSystems\\ordbogen.com\\ordbogen.exe" checkedbydefault="False" /> <application description="Ordbogen.com" executable="C:\\Windows\\System32\\mspaint.exe" checkedbydefault="False" /> </launch>
Annonceindlæg fra Computerworld it-jobbank
En .NET 2.0 løsning: using System; using System.Collections.Generic; using System.Xml; namespace E { public class Program { public static void Main(string[] args) { string xmlstr = @"<?xml version='1.0' encoding='utf-8' standalone='yes'?> <launch rememberpreviouslycheckedapplications='False' autolaunchdelay='10'> <application description='Notepad++' executable='C:\\Programmer\\Notepad++\\notepad++.exe' checkedbydefault='False' /> <application description='Paint' executable='C:\\Program Files\\CoolSystems\\ordbogen.com\\ordbogen.exe' checkedbydefault='False' /> <application description='Ordbogen.com' executable='C:\\Windows\\System32\\mspaint.exe' checkedbydefault='False' /> </launch>"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlstr); List<XmlElement> apps = new List<XmlElement>(); foreach(XmlElement app in doc.DocumentElement.GetElementsByTagName("application")) { apps.Add(app); } foreach(XmlElement app in apps) { Console.WriteLine(app.Attributes["description"].Value); } apps.Sort(delegate(XmlElement a1, XmlElement a2) { return a1.Attributes["description"].Value.CompareTo(a2.Attributes["description"].Value); }); foreach(XmlElement app in apps) { Console.WriteLine(app.Attributes["description"].Value); } Console.ReadKey(); } } }
Og en 3.5: using System; using System.IO; using System.Linq; using System.Xml.Linq; namespace E { public class Program { public static void Main(string[] args) { string xmlstr = @"<?xml version='1.0' encoding='utf-8' standalone='yes'?> <launch rememberpreviouslycheckedapplications='False' autolaunchdelay='10'> <application description='Notepad++' executable='C:\\Programmer\\Notepad++\\notepad++.exe' checkedbydefault='False' /> <application description='Paint' executable='C:\\Program Files\\CoolSystems\\ordbogen.com\\ordbogen.exe' checkedbydefault='False' /> <application description='Ordbogen.com' executable='C:\\Windows\\System32\\mspaint.exe' checkedbydefault='False' /> </launch>"; XElement launch = XElement.Load(new StringReader(xmlstr)); var apps1 = from app in launch.Elements("application") select app; foreach(XElement app in apps1) { Console.WriteLine(app.Attribute("description").Value); } var apps2 = from app in launch.Elements("application") orderby app.Attribute("description").Value select app; foreach(XElement app in apps2) { Console.WriteLine(app.Attribute("description").Value); } Console.ReadKey(); } } }
Slettet bruger
08. juni 2008 - 15:16
#3
Hvad bliver 3.5'eren, hvis jeg allerede har et XmlDocument? Jeg kan sgu ikke helt gennemskue koden.
Hvis du vil bruge LINQ, så tror jeg at du ska bruge LINQ hele vejen igennem og droppe XmlDocument.
Slettet bruger
09. juni 2008 - 10:30
#5
Hvad er LINQ?
Slettet bruger
11. juni 2008 - 09:50
#7
Tak. Jeg kikker lige på det.
Slettet bruger
11. juni 2008 - 09:53
#8
Jeg kan sgu stadig ikke få det til at virke :( public static XmlDocument SortXml() { Xml = from application in Xml.Elements("application") select application; return Xml; } Den kan ikke finde Xml.Elements.
Jeg kan ikke helt se hvordan den kode sekvens haenger sammen med LINQ. Man kalder .Elements paa en instans af XElement og en LINQ statement returnerer en IEnumerable som det som oftest er bedst at erklaere som var (type inferens). I din kode bruger du variablen Xml som XElement (.Elements kald), var (retur fra LINQ) og XmDocument (retur fra metode).
Slettet bruger
11. juni 2008 - 12:09
#10
Hvad skal jeg så skrive i stedet?
Slettet bruger
11. juni 2008 - 12:11
#11
... når jeg ønsker at sortere childs til noden 'launch' i XmlDocument Xml ud fra attributen 'description'? Det er nemlig det, jeg forsøger at gøre.
13. juni 2008 - 18:20
#12
det viste jeg jo 07/06-2008 23:27:44
Slettet bruger
13. juni 2008 - 20:50
#13
Jamen hvordan gør du det med et XmlDocument?
13. juni 2008 - 21:34
#14
det var 07/06-2008 23:10:32
Slettet bruger
14. juni 2008 - 10:19
#15
Hov - jeg overså doc.LoadXml(xmlstr)... My bad :S
15. juni 2008 - 20:45
#16
jeg smider et svar så
Slettet bruger
15. juni 2008 - 21:45
#17
Fint... Så kikker jeg ordentligt på det, når jeg får tid/taget mig sammen.
Slettet bruger
16. juni 2008 - 11:55
#18
Hm. Det virker, men hvordan får jeg så mit oprindelige XmlDocument sorteret som apps?
17. juni 2008 - 03:08
#19
Så bliver du nok nødt til at lave et nyt XmlDocument og så importere noderne til det i den rigtige rækkefølge.
Slettet bruger
17. juni 2008 - 11:26
#20
Ja (havde jeg regnet ud) - men hvordan får jeg lige noderne flyttet fra XmlElements til XmlDocument?
17. juni 2008 - 15:14
#21
noget a la: newdoc.DocumentElement.AppendChild(newdoc.ImportNode(elmfromolddoc, true));
Slettet bruger
17. juni 2008 - 15:47
#22
Skønt. Jeg tester det lige, når jeg har fikset noget software her...
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.