不使用for循环创建XmlDocument

时间:2014-01-11 10:20:54

标签: c# foreach linq-to-xml xmldocument

您好我正在使用产品数据创建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的情况下生成相同的文件。

任何解决方案?

1 个答案:

答案 0 :(得分:3)

如果您需要生成大型xml文件,请使用XmlWriter代替XmlDocumentXmlDocument构建内存中的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创建期间进行四舍五入。