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

C# 将子节点附加到空节点列表。(内存不足异常),c#,linq,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"

我有一个类似于以下内容的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>
现在,在我的实际数据文件中,我有大约600个空节点,我想在其中附加10个子节点

我不应该因此而出现内存不足的异常


如何解决此错误?

您的listcars有一个问题,因为它不会提供确切的空车。 试试这段代码,它正在工作

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

            var allCars = xDoc.Root.Elements();

            var carToUse = allCars.Where(x => x.Attribute("name").Value == "Honda").FirstOrDefault();
            var listCars = carToUse.Descendants("part").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);
            }
        }

与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
        }
    }

xDoc.substands(“root”).substands()
表示所有子体(包括部分)都是
xDoc.substands(“root”).Elements()
。我不知道这是否能解决任何问题,但首先要解决你的代码。您的
listCars
变量与示例一起也是空的。。。提问前调试这与我在评论中所说的完全相同。@Ankit基本相同,尽管我列出的没有零件的汽车略有不同
var carswithNoparts=allCars.Where(x=>x.HasElements==false.ToList(),一些变量名更能代表它们所承载的内容。英雄所见略同!
    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
        }
    }