Avatar billede 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>
Avatar billede arne_v Ekspert
07. juni 2008 - 23:10 #1
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();
        }
    }
}
Avatar billede arne_v Ekspert
07. juni 2008 - 23:27 #2
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();
        }
    }
}
Avatar billede 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.
Avatar billede arne_v Ekspert
08. juni 2008 - 16:58 #4
Hvis du vil bruge LINQ, så tror jeg at du ska bruge LINQ hele vejen igennem og droppe
XmlDocument.
Avatar billede Slettet bruger
09. juni 2008 - 10:30 #5
Hvad er LINQ?
Avatar billede arne_v Ekspert
09. juni 2008 - 14:29 #6
var apps1 = from app in launch.Elements("application")
                        select app;

http://en.wikipedia.org/wiki/LINQ
Avatar billede Slettet bruger
11. juni 2008 - 09:50 #7
Tak. Jeg kikker lige på det.
Avatar billede 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.
Avatar billede arne_v Ekspert
11. juni 2008 - 11:02 #9
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).
Avatar billede Slettet bruger
11. juni 2008 - 12:09 #10
Hvad skal jeg så skrive i stedet?
Avatar billede 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.
Avatar billede arne_v Ekspert
13. juni 2008 - 18:20 #12
det viste jeg jo 07/06-2008 23:27:44
Avatar billede Slettet bruger
13. juni 2008 - 20:50 #13
Jamen hvordan gør du det med et XmlDocument?
Avatar billede arne_v Ekspert
13. juni 2008 - 21:34 #14
det var 07/06-2008 23:10:32
Avatar billede Slettet bruger
14. juni 2008 - 10:19 #15
Hov - jeg overså doc.LoadXml(xmlstr)... My bad :S
Avatar billede arne_v Ekspert
15. juni 2008 - 20:45 #16
jeg smider et svar så
Avatar billede Slettet bruger
15. juni 2008 - 21:45 #17
Fint... Så kikker jeg ordentligt på det, når jeg får tid/taget mig sammen.
Avatar billede Slettet bruger
16. juni 2008 - 11:55 #18
Hm. Det virker, men hvordan får jeg så mit oprindelige XmlDocument sorteret som apps?
Avatar billede arne_v Ekspert
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.
Avatar billede 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?
Avatar billede arne_v Ekspert
17. juni 2008 - 15:14 #21
noget a la:

newdoc.DocumentElement.AppendChild(newdoc.ImportNode(elmfromolddoc, true));
Avatar billede Slettet bruger
17. juni 2008 - 15:47 #22
Skønt. Jeg tester det lige, når jeg har fikset noget software her...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I dag 10:28 PDFEngine Af barth i Andet software
I går 22:40 Butte indhold i celler Af lurup i Excel
I går 15:24 Power Query Af djsimonsen i Excel
I går 14:43 Hvis ikke på liste, tilføj værdier til liste Af TheLibrarian i Excel
I går 11:33 Windows 11 Af ranni i Windows