我有一个 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++;
}
感谢你的帮助!