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#で複製する方法がわかりません。
したがって、最初に XML 内の一意の att1 値をすべて見つける必要があると思います。私はこれを使用してこれを行うことができます:
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++;
}
ご助力いただきありがとうございます!