2017-03-03 34 views
0

我有類似這樣的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> 

我想要做的就是更新一個沒有零件並添加本田具有相同部件的任何轎廂節點。 (這個例子中的「Chevy」不應該更新)

我在代碼中發現內存不足異常。

我的代碼類似於:

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); 
    } 
} 

現在,在我的實際數據文件,我有我要追加10個孩子節點,以約600空節點。

我不應該得到一個內存不足的例外。

如何解決此錯誤?

+0

'xDoc.Descendants( 「根」)後裔()'是指所有後代(包括零部件)使它'xDoc.Descendants( 「根」 ).Elements()'。我不知道這是否會解決任何問題,但首先修復您的代碼。你的'listCars'變量在你的例子中是空的......在提問之前調試 – EpicKip

回答

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 
     } 
    } 
+0

中說的,它與我的完全相同。 – Ankit

+0

@Ankit其實基本一樣,儘管我列出的車輛沒有任何零件稍有不同。 'var carswithNoparts = allCars.Where(x => x.HasElements == false).ToList();'和一些變量名稱更能代表它們的主機。英雄所見略同! –

1

與您的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); 
      } 
     } 
+0

這不再是我在評論 – EpicKip

相關問題