У меня есть лента XML (которую я не контролирую), и я пытаюсь выяснить, как определить объем определенных значений атрибутов в документе.
Я также анализирую XML и разделяю атрибуты на массивы (для других функций)
Вот пример моего 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>
Я хочу найти узлы тома на основе каждого значения att1. Значение Att1 изменится. Как только я узнаю частоту значений att1, мне нужно получить значение att2 этого узла.
Мне нужно найти ТОП 4 предметов и вытащить значения их атрибутов.
Все это должно быть сделано в коде C #.
Если бы я использовал Javascript, я бы создал ассоциативный массив и имел бы значение att1, а значение - частоту. Но так как я новичок в c #, я не знаю, как продублировать это в c #.
Поэтому я считаю, что сначала мне нужно найти все уникальные значения att1 в XML. Я могу сделать это используя:
IEnumerable<string> uItems = uItemsArray.Distinct();
// Where uItemsArray is a collection of all the att1 values in an array
Затем я зацикливаюсь на том, как сравнивать каждое уникальное значение att1 со всем документом, чтобы получить объем, хранящийся в переменной, массиве или любом другом наборе данных.
Вот фрагмент, который я использовал:
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++;
}
Спасибо за вашу помощь!