2016-04-19 14 views
0

私のXMLはこのように見えます。 n個のモジュールとn個の割り当てを含むことができます。割り当ては、それが含まれているモジュール内にネストされています特定の要素にアクセスしてデータを取得する方法XML

<?xml version="1.0"?> 
<Course name="engineering"> 
<Level4> 
    <Module Name="electric" CreditVal="22"> 
     <Assignment Name="wer" Score="22" Weight="50"> 
     </Assignment> 
     <Assignment Name="asd" Score="50" Weight="50"> 
     </Assignment> 
    </Module> 
    <Module Name="materials" CreditVal="22"> 
     <Assignment Name="ghj" Score="22" Weight="75> 
     </Assignment> 
     <Assignment Name="kl" Score="80" Weight="15"> 
     </Assignment> 
    </Module> 
</Level4> 
</Course> 

私は、次のことで、モジュールおよび割り当てをアクセスしていますが:

起こることになって何
XPathDocument xpd = new XPathDocument("XMLFile.xml"); 

//getting modules in level 4 
foreach (XPathNavigator mod in xpd.CreateNavigator().Select("/Course/Level4/Module")) 
{ 
    //Accessing module elemtns 
    if (mod.HasAttributes) 
    { 
     Module modtoadd = new Module(); 
     modtoadd.Name = mod.GetAttribute("Name", ""); 
     Console.WriteLine("module name: " + modtoadd.Name); 
     modtoadd.CreditValue = int.Parse(mod.GetAttribute("CreditVal", "")); 
     Console.WriteLine("module cred: " + modtoadd.CreditValue); 
     modtoadd.Assignments = new List<Assignment>(); 
     //Accessing assignment elements within the module element 
     foreach (XPathNavigator asgn in xpd.CreateNavigator().Select("Course/Level4/Module/Assignment")) 
     { 
      Assignment asn = new Assignment(); 
      asn.Name = asgn.GetAttribute("Name", ""); 
      Console.WriteLine(asn.Name); 
      asn.Weighting = int.Parse(asgn.GetAttribute("Weight", "")); 
      Console.WriteLine(asn.Weighting); 
      asn.UsersScore = int.Parse(asgn.GetAttribute("Score", "")); 
      Console.WriteLine(asn.UsersScore); 
      modtoadd.Assignments.Add(asn); 
     }; 
     courseXML.Level_41.Add(modtoadd); 
    } 
}; 

:XMLReaderがでネストされた割り当てを読み込みますそれが存在する相対的なモジュールモジュールスコアを合計すると 'eletric'は72になり、 'materials'は102になります。

実際に何が起こったのですか:テストした後、私はロジックに問題があることを認識しました。これは、1つのモジュールが保存されているときにうまく動作しますが、複数のモジュールがある場合、すべての割り当てがすべてのモジュールに追加されます。モジュールスコアを合計すると、材料と電気は両方とも価値があります。

私はXMLを読んでいないし、ファイルを読み書きしています。助けてくれてありがとう:

+0

ところで、あなたのxml(module 'materials'-> assignment' ghj')には、閉じられていないquotがあります。 – Xiaoy312

答えて

1

私はいつもLinq2Xmlを使いやすくしています。

var xDoc = XDocument.Load(filename); 
var res = xDoc.Descendants("Module") 
      .Select(m => new 
      { 
       Name = (string)m.Attribute("Name"), 
       CreditVal = (int)m.Attribute("CreditVal"), 

       Assignments = m.Descendants("Assignment") 
           .Select(a => new 
           { 
            Name = (string)a.Attribute("Name"), 
            Score = (int)a.Attribute("Score"), 
            Weight = (int)a.Attribute("Weight") 
           }) 
           .ToList() 
      }) 
      .ToList(); 
+0

大丈夫。そして、私は 'm.Descendants(" Assignments ")...'メソッド本体の相対的な割り当ての個々の属性にアクセスしますか?だから、モジュールオブジェクトに代入属性を設定したいのであれば、 '.Select(a => new {...'の部分? – Tarikh

+0

@Tarikhあなたが求めているものは得られません... – Eser

+0

アサインメント内のアトリビュートにアクセスしてそれらをストア/操作できるようにするにはどうすればよいでしょうか?そして、.ToList()はどういう意味ですか? – Tarikh

0

問題ではなく、現在のmod下neated Assignmentを読んで、あなたはドキュメントからすべてのAssignmentから読んでいるということです。

//foreach (XPathNavigator asgn in xpd.CreateNavigator().Select("Course/Level4/Module/Assignment")) 
foreach (XPathNavigator asgn in mod.CreateNavigator().Select("Assignment")) 

ただし、@ Eserが提供するソリューションの使用を検討してください。それはあなたのアプローチより簡単でなければなりません。

関連する問題