2017-03-03 4 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

:。

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で1つの問題は、それはあなたに正確な空の車を与えることはありません。 このコードを試してみてください。 Ankitの答えとほぼ同じ

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

関連する問題