Avatar billede jaffafo Nybegynder
01. november 2005 - 13:43 Der er 12 kommentarer og
1 løsning

Hive 11 de højeste tal fra en XML fil

Hej

Jeg har en XML og jeg har brug for at få fat i de 11 højeste tal i en bestemt kolonne. Jeg har brug for at kunne hente de 11 tal og for hvert tal skal jeg have fat i en anden kolonne i samme række.

Eks.

Tabel bil
Kolonner: Årgang | Model | Døre

og så har jeg f.eks. 14 biler i XML'en

Jeg skal så have fat i 11 de nyeste biler, men kunne skrive det ud sådan her:

Ford Escort (1984)
Toyota Corolla (1985)
Suzuki Alto (1986)
BMW 2.5 (1986)
Porsche Turbo (1990)
Lamborghini (1991)
Ferrari GTO (1994)
Nissan Skyline GTR (1996)
Chrysler (1998)
Mercedes CLK (2002)
Ford Orion (2005)

Tag jer ikke af at listen er ukorrekt :P det er bare et eksempel :)
Avatar billede arne_v Ekspert
01. november 2005 - 23:11 #1
det lyder meget som en database tabel

det var meget nemmere at lave den udvælgelse i SQL mod en database

muligt ?
Avatar billede jaffafo Nybegynder
01. november 2005 - 23:23 #2
Nej desværre da det er en extern XML som jeg ikke har mulighed for at ændre :/

XML'en ser sådan her ud:

<xml>
<fabrik>
  <fabrikid>1</fabrikid>
  <navn>Biler Inc.</navn>
  <modeller>
  <model>
    <modelid>23</modelid>
    <navn>Ford Escort</navn>
    <årgang>1980</årgang>
  </model>
  </modeller>
</fabrik>
</xml>

Er det muligt at lave med et simpelt udtræk eller skal der gang i det store koderi for at gøre det?
Avatar billede arne_v Ekspert
01. november 2005 - 23:42 #3
Læs ind fra XML til en collection (ArrayList eller type safe) af objekter af en
model klasse som implementerer IComparable, sorter og snup de 11 første.

Jeg har overveje XSLT & XPath men jeg tror at det andet er nemmere.
Avatar billede jaffafo Nybegynder
01. november 2005 - 23:47 #4
Det første kender jeg intet til har du et lille eksempel på det?
Avatar billede arne_v Ekspert
02. november 2005 - 00:08 #5
<?xml version="1.0" encoding="iso-8859-1"?>
<biler>
<fabrik>
  <fabrikid>1</fabrikid>
  <navn>Ford</navn>
  <modeller>
    <model>
      <modelid>1</modelid>
      <navn>Escort</navn>
      <årgang>1990</årgang>
    </model>
    <model>
      <modelid>2</modelid>
      <navn>Sierra</navn>
      <årgang>1989</årgang>
    </model>
  </modeller>
</fabrik>
<fabrik>
  <fabrikid>2</fabrikid>
  <navn>VW</navn>
  <modeller>
    <model>
      <modelid>1</modelid>
      <navn>Golf</navn>
      <årgang>1991</årgang>
    </model>
  </modeller>
</fabrik>
</biler>
Avatar billede arne_v Ekspert
02. november 2005 - 00:08 #6
using System;
using System.Collections;
using System.Xml;

namespace E
{
    public class Model
    {
        private int id;
        private string name;
        private int year;
        public Model() : this(0, "", 0)
        {
        }
        public Model(int id, string name, int year)
        {
            this.id = id;
            this.name = name;
            this.year = year;
        }
        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public int Year
        {
            get
            {
                return year;
            }
            set
            {
                year = value;
            }
        }
        public override string ToString()
        {
            return ("[" + id + "," + name + "," + year + "]");
        }
    }
    public class ModelNameComparer : IComparer
    {
        int IComparer.Compare(Object o1, Object o2)
        {
            return String.Compare(((Model)o1).Name,((Model)o2).Name);
        }
    }
    public class ModelYearComparer : IComparer
    {
        int IComparer.Compare(Object o1, Object o2)
        {
            return (((Model)o1).Year - ((Model)o2).Year);
        }
    }
    class MainClass
    {
        public static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\biler.xml");
            XmlNodeList models = doc.GetElementsByTagName("model");
            ArrayList lst = new ArrayList();
            foreach(XmlNode model in models)
            {
                lst.Add(new Model(int.Parse(model.ChildNodes[0].FirstChild.Value),
                                  model.ChildNodes[1].FirstChild.Value,
                                  int.Parse(model.ChildNodes[2].FirstChild.Value)));
            }
            Console.WriteLine("som indlæst:");
            for(int i = 0; i < lst.Count; i++)
            {
                Console.WriteLine(lst[i]);
            }
            lst.Sort(new ModelNameComparer());
            Console.WriteLine("efter navne sortering:");
            for(int i = 0; i < lst.Count; i++)
            {
                Console.WriteLine(lst[i]);
            }
            lst.Sort(new ModelYearComparer());
            Console.WriteLine("efter årgangs ortering:");
            for(int i = 0; i < lst.Count; i++)
            {
                Console.WriteLine(lst[i]);
            }
        }
    }
}
Avatar billede arne_v Ekspert
02. november 2005 - 00:09 #7
som indlæst:
[1,Escort,1990]
[2,Sierra,1989]
[1,Golf,1991]
efter navne sortering:
[1,Escort,1990]
[1,Golf,1991]
[2,Sierra,1989]
efter årgangs ortering:
[2,Sierra,1989]
[1,Escort,1990]
[1,Golf,1991]
Avatar billede arne_v Ekspert
02. november 2005 - 00:09 #8
det er en console app, men indlæsning fra XML og sortering kan sagtens bruges i
ASP.NET
Avatar billede jaffafo Nybegynder
02. november 2005 - 00:15 #9
takker :)

jeg skal lige oversætte til vb.net så tester jeg det :)
Avatar billede arne_v Ekspert
02. november 2005 - 23:37 #10
jeg vil da godt konvertere det hvis det skulle være
Avatar billede arne_v Ekspert
02. november 2005 - 23:37 #11
og et svar
Avatar billede jaffafo Nybegynder
03. november 2005 - 08:42 #12
Du må gerne konvertere det hvis du vil :)

Jeg er ikke særlig god til C# :/
Avatar billede arne_v Ekspert
03. november 2005 - 12:14 #13
Imports System
Imports System.Collections
Imports System.Xml

Namespace E
    Public Class Model
        Private _id As Integer
        Private _name As String
        Private _year As Integer

        Public Sub New()
            MyClass.New(0, "", 0)
        End Sub

        Public Sub New(ByVal id As Integer, ByVal name As String, ByVal year As Integer)
            _id = id
            _name = name
            _year = year
        End Sub

        Public Property Id() As Integer
            Get
                Return _id
            End Get
            Set
                _id = value
            End Set
        End Property

        Public Property Name() As String
            Get
                Return _name
            End Get
            Set
                _name = value
            End Set
        End Property

        Public Property Year() As Integer
            Get
                Return _year
            End Get
            Set
                _year = value
            End Set
        End Property

        Public Overloads Overrides Function ToString() As String
            Return ("[" & _id & "," & _name & "," & _year & "]")
        End Function
    End Class

    Public Class ModelNameComparer
    Implements IComparer
        Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
            Return String.Compare(CType(o1, Model).Name, CType(o2, Model).Name)
        End Function
    End Class

    Public Class ModelYearComparer
    Implements IComparer
        Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
            Return (CType(o1, Model).Year - CType(o2, Model).Year)
        End Function
    End Class

    Class MainClass

        Public Shared Sub Main(ByVal args As String())
            Dim doc As XmlDocument = New XmlDocument
            doc.Load("C:\biler.xml")
            Dim models As XmlNodeList = doc.GetElementsByTagName("model")
            Dim lst As ArrayList = New ArrayList
            For Each model As XmlNode In models
                lst.Add(New Model(Integer.Parse(model.ChildNodes(0).FirstChild.Value), model.ChildNodes(1).FirstChild.Value, Integer.Parse(model.ChildNodes(2).FirstChild.Value)))
            Next
            Console.WriteLine("som indlæst:")
            Dim i As Integer
            For i = 0 To lst.Count - 1
                Console.WriteLine(lst(i))
            Next
            lst.Sort(New ModelNameComparer)
            Console.WriteLine("efter navne sortering:")
            For i = 0 To lst.Count - 1
                Console.WriteLine(lst(i))
            Next
            lst.Sort(New ModelYearComparer)
            Console.WriteLine("efter årgangs ortering:")
            For i = 0 To lst.Count - 1
                Console.WriteLine(lst(i))
            Next
        End Sub
    End Class
End Namespace
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