您好我正在使用产品数据创建XmlDocument。我的代码
foreach (var pv in pvs)
{
XmlElement product = xml.CreateElement("Product");
product.SetAttribute("SKU", pv.Sku);
root.AppendChild(product);
var pname = xml.CreateElement("Name");
pname.InnerText = pv.Product.Name;
product.AppendChild(pname);
var MRP = xml.CreateElement("Mrp");
MRP.InnerText = Math.Round(pv.OldPrice, 2).ToString();
var SKU_MRP = _barcodeService.GetMRPsBySku(pv.Sku);
var mrps = SKU_MRP.AsEnumerable().Select(s => s.MRP).ToList();
if (mrps.Count > 0)
{
mrpstring = string.Join<string>(",", mrps.Select(x => Math.Round(x, 2).ToString()).Where(x => x != Math.Round(pv.OldPrice, 2).ToString()).ToList());
}
if (!string.IsNullOrEmpty(mrpstring))
{
MRP.InnerText += "," + mrpstring;
}
product.AppendChild(MRP);
}
xml.Save(path);
以上代码我粘贴的只是我整个功能的一部分。请注意,我从我的barcodeservice函数调用方法返回IList。
我的pv
计数超过5000.所以它需要5-7分钟才能生成完整的文件。
现在是否有任何解决方法来最小化负载或如何在不使用foreach的情况下生成相同的文件。
任何解决方案?
答案 0 :(得分:3)
如果您需要生成大型xml文件,请使用XmlWriter
代替XmlDocument
。 XmlDocument
构建内存中的xml表示形式,然后才能将其保存到文件中。 XmlWriter
将数据直接写入文件。
使用XmlWriter
,您的循环将如下所示:
using(XmlWriter writer = XmlWriter.Create(fileName))
{
writer.WriteStartDocument();
writer.WriteStartElement("Products");
foreach (var pv in pvs)
{
writer.WriteStartElement("Product");
writer.WriteAttributeString("SKU", pv.Sku);
writer.WriteElementString("Name", pv.Product.Name);
// ...
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
您还可以优化mrpstring
创建(如果价格存储为十进制值):
decimal oldPrice = Math.Round(pv.OldPrice, 2);
var SKU_MRP = _barcodeService.GetMRPsBySku(pv.Sku);
var newPrices = SKU_MRP.AsEnumerable()
.Select(s => Math.Round(s.MRP, 2))
.Where(mrp => mrp != oldPrice);
mrpstring = String.Join(",", newPrices);
因此您只需要枚举新价格,然后您不需要将它们保存到列表中,也不需要检查计数,因为如果没有任何要加入,则join将返回空字符串。此外,如果您使用decimals
作为价格,请避免将其转换为字符串,或仅考虑在mrpstring
创建期间进行四舍五入。