将子节点附加到空节点列表。 (内存异常)

时间:2017-03-03 14:55:50

标签: c# linq

我有一个与此类似的xml:

<root>
   <car name="Honda">
    <part name="part1" />
    <part name="part2" />
    <part name="part3" />
   </car>
   <car name="Ford" />
   <car name="Subaru" />
   <car name="VW" />
   <car name="Chevy">
    <part name="part5" />
    <part name="part6" />
    <part name="part7" />
   </car>
   <car name="BMW" />
</root>

我想要做的是更新任何没有零件的汽车节点,并添加与本田相同的零件。 (&#34; Chevy&#34;在此示例中不应更新)

我的代码中出现内存不足的异常。

我的代码类似于:

   using (StreamReader sr = new StreamReader(@"C:\MyFile.xml", true))
{
    XDocument xDoc = XDocument.Load(sr);

    var allCars = xDoc.Descendants("root").Descendants().ToList();

    var carToUse = allCars.Where(x => x.Attribute("name").Value == "Honda").FirstOrDefault();
    var listCars = carToUse.Descendants("car").ToList();

    var fullCars = allCars.Where(x => x.Descendants("part").Any()).ToList();
    var emptyPermissions = allCars.Where(x => x.Descendants("part").Any() == false).ToList();

    foreach (var perm in emptyPermissions)
    {
        perm.Add(listCars);
    }
}

现在在我的实际数据文件中,我有大约600个空节点,我想将10个子节点附加到。

我不应该为此获得内存不足。

如何解决此错误?

2 个答案:

答案 0 :(得分:1)

您的列表车存在一个问题,因为它不会为您提供准确的空车。 试试这个代码吧。

<h3 style="color:#00bfff;margin:-14px 0 16px 0px" class="inline" *ngIf="data.for == 'next'">{{data.bannerText}}<sup><small>{{data.super}}</small></sup></h3><span class="NotinStockGrey" > {{data.textOne}} </span><span style="color:#00bfff">{{data.textTWo}}</span>

答案 1 :(得分:0)

几乎与Ankit的答案相同:

    private void DoIt()
    {
        using (StreamReader sr = new StreamReader(@"M:\StackOverflowQuestionsAndAnswers\XMLStuff_42582050\XMLStuff_42582050\sample.xml", true))
        {
            XDocument xDoc = XDocument.Load(sr);//load your xml
            var allCars = xDoc.Root.Elements("car");//get a list of all the cars
            var carToUse = allCars.Where(x => x.Attribute("name").Value == "Honda").FirstOrDefault();//pick the one car to use
            var hondaParts = carToUse.Descendants("part");//get the parts of the car to use
            var carswithNoparts = allCars.Where(x => x.HasElements == false).ToList();//get all the cars with no parts
            foreach (var car in carswithNoparts)//iterate through the cars with no parts
            {
                car.Add(hondaParts);//add the honda parts
            }
            xDoc.Save(@"M:\StackOverflowQuestionsAndAnswers\XMLStuff_42582050\XMLStuff_42582050\out.xml");//save output
        }
    }
相关问题