Frage

Ich habe einen XML-Feed (die ich nicht kontrollieren) und ich versuche, herauszufinden, wie man das Volumen bestimmter Attributwerte innerhalb des Dokuments zu erfassen.

Ich bin auch das Parsen von XML und Attributen in Arrays (für andere Funktionen)

Trennung

Hier ist ein Beispiel meiner XML

<items>
<item att1="ABC123" att2="uID" />
<item att1="ABC345" att2="uID" />
<item att1="ABC123" att2="uID" />
<item att1="ABC678" att2="uID" />
<item att1="ABC123" att2="uID" />
<item att1="XYZ123" att2="uID" />
<item att1="XYZ345" att2="uID" />
<item att1="XYZ678" att2="uID" />
</items>

Ich möchte die Lautstärke Knoten auf jedem att1 Wert basiert finden. Att1 Wert wird sich ändern. Sobald ich die Frequenz von att1 Werte wissen muss ich den att2 Wert dieses Knotens ziehen.

Ich brauche die TOP 4 Elemente zu finden und die Werte ihrer Attribute ziehen.

All dies muss hinter in C # -Code zu tun.

Wenn ich Javascript wurde mit Ich würde ein assoziatives Array erstellen und haben att1 den Schlüssel und die Frequenz der Wert sein. Aber da ich auf c # neu bin, weiß ich nicht, wie dies zu duplizieren in c #.

So glaube ich, zuerst muss ich alle eindeutigen att1 Werte in der XML finden. Ich kann tun dies mit:

IEnumerable<string> uItems = uItemsArray.Distinct();
// Where uItemsArray is a collection of all the att1 values in an array

Dann bekomme ich fest, wie ich vergleiche jeden eindeutigen att1 Wert für das gesamte Dokument das Volumen in einer Variablen oder Array gespeichert zu bekommen oder was auch immer Datensatz.

Hier ist das Snippet ich am Ende mit:

        XDocument doc = XDocument.Load(@"temp/salesData.xml");
        var topItems = from item in doc.Descendants("item")
                    select new
                    {
                        name = (string)item.Attribute("name"),
                        sku = (string)item.Attribute("sku"),
                        iCat = (string)item.Attribute("iCat"),
                        sTime = (string)item.Attribute("sTime"),
                        price = (string)item.Attribute("price"),
                        desc = (string)item.Attribute("desc")

                    } into node
                    group node by node.sku into grp
                    select new { 
                        sku = grp.Key,
                        name = grp.ElementAt(0).name,
                        iCat = grp.ElementAt(0).iCat,
                        sTime = grp.ElementAt(0).sTime,
                        price = grp.ElementAt(0).price,
                        desc = grp.ElementAt(0).desc,
                        Count = grp.Count() 
                    };

        _topSellers = new SalesDataObject[4];
        int topSellerIndex = 0;
        foreach (var item in topItems.OrderByDescending(x => x.Count).Take(4))
        {
            SalesDataObject topSeller = new SalesDataObject();
            topSeller.iCat = item.iCat;
            topSeller.iName = item.name;
            topSeller.iSku = item.sku;
            topSeller.sTime = Convert.ToDateTime(item.sTime);
            topSeller.iDesc = item.desc;
            topSeller.iPrice = item.price;
            _topSellers.SetValue(topSeller, topSellerIndex);
            topSellerIndex++;
        } 

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Wenn Sie die Werte haben, sollten Sie in der Lage sein GroupBy zu verwenden LINQ ...

        XDocument doc = XDocument.Parse(xml);
        var query = from item in doc.Descendants("item")
                    select new
                    {
                        att1 = (string)item.Attribute("att1"),
                        att2 = (string)item.Attribute("att2") // if needed
                    } into node
                    group node by node.att1 into grp
                    select new { att1 = grp.Key, Count = grp.Count() };

        foreach (var item in query.OrderByDescending(x=>x.Count).Take(4))
        {
            Console.WriteLine("{0} = {1}", item.att1, item.Count);
        }

Andere Tipps

Sind Sie mit .NET 3.5? (Es sieht aus wie es auf dem Code basiert.) Wenn ja, ich vermute, dies mit LINQ ist recht einfach zu XML und LINQ to Objects. Aber ich fürchte, es aus Ihrem Beispiel nicht klar, was Sie wollen. Sind alle Werte mit dem gleichen att1 auch haben die gleiche att2? Wenn ja, es ist so etwas wie:

var results = (from element in items.Elements("item")
              group element by element.Attribute("att1").Value into grouped
              order by grouped.Count() descending
              select grouped.First().Attribute("att2").Value).Take(4);

ich es nicht getestet, aber ich denkt es sollte funktionieren ...

  • Wir beginnen mit allen Artikeln Elementen aus
  • Wir gruppieren sie (noch als Elemente) durch ihre att1 Wert
  • Wir sortieren die Gruppen, die durch ihre Größe, absteigend so die größte ist erste
  • Aus jeder Gruppe nehmen wir das erste Element seiner att2 Wert finden
  • Wir nehmen die ersten vier dieser Ergebnisse

Sie können LINQ / XLinq verwenden, um dies zu erreichen. Unten ist ein Beispiel Konsolenanwendung Ich schrieb, so dass der Code nicht optimiert werden könnte, aber es funktioniert.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;

namespace FrequencyThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            string data = @"<items>
                            <item att1=""ABC123"" att2=""uID"" />
                            <item att1=""ABC345"" att2=""uID"" />
                            <item att1=""ABC123"" att2=""uID"" />
                            <item att1=""ABC678"" att2=""uID"" />
                            <item att1=""ABC123"" att2=""uID"" />
                            <item att1=""XYZ123"" att2=""uID"" />
                            <item att1=""XYZ345"" att2=""uID"" />
                            <item att1=""XYZ678"" att2=""uID"" />
                            </items>";
            XDocument doc = XDocument.Parse(data);
            var grouping = doc.Root.Elements().GroupBy(item => item.Attribute("att1").Value);

            foreach (var group in grouping)
            {
                var groupArray = group.ToArray();
                Console.WriteLine("Group {0} has {1} element(s).", groupArray[0].Attribute("att1").Value, groupArray.Length);
            }

            Console.ReadKey();
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top