01. november 2005 - 13:43Der 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 :)
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.
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]); } } } }
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
Synes godt om
Ny brugerNybegynder
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.