2016-06-27 4 views
0

私のXMLファイルは次のようになります。XDocumentをループし、子ノードの値を取得する

<PictureBoxes> 
    <P14040105> 
    <SizeWidth>100</SizeWidth> 
    <SizeHeight>114</SizeHeight> 
    <locationX>235</locationX> 
    <locationY>141</locationY> 
    </P14040105> 
    <P13100105> 
    <SizeWidth>100</SizeWidth> 
    <SizeHeight>114</SizeHeight> 
    <locationX>580</locationX> 
    <locationY>274</locationY> 
    </P13100105> 
</PictureBoxes> 

私が実際にやっていることは、フォーム内の各コントロールをループして、XMLファイルにSizeプロパティとLocationプロパティを保存することです。 <P...>ノードは実際には私のpictureboxの名前であり、その名前も使用する必要があります。

XMLを作成した後、XMLファイルを使用して、フォーム上にピクチャボックスを再度作成します。だから私が必要とするのは、<P...>ノードの名前と子ノードの値を取得することです。

+0

@PhilipKendallまあ、何も、初めてしようとXMLと私は、検索を見つけたことは、私は番目の名前を知っているときのためにあると思われますe親ノード、この場合、私はしません。私は ''と ''の下に値を取得する必要がありますが、私はそれらのノード名を知らない。 – crimson589

答えて

1

xmlファイルからデータをロードしてそれぞれ保存するには、FormLoadFormClosingのメソッドを調べる必要があります。 PictureBoxes要素の子要素を通って、各要素のためのあなたのFormLoad方法のループでは

PictureBoxを作成し、以下に示すように、それは、XMLデータからの値です設定:

protected override OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    var doc = XDocument.Load("path/to/xml/file"); 
    foreach(var element in doc.Descendant("PictureBoxes").Elements()) 
    { 
     var pb = new PictureBox(); 
     pb.Name = element.Name.LocalName; 
     pb.Size.Width = Convert.ToInt32(element.Element("SizeWidth").Value)); 
     // other properties here 
     this.Controls.Add(pb); 
    } 
} 

と逆のことを行うFormClosingに - 画像ボックスを反復処理し、XMLのプロパティを保存します。

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    base.OnFormClosing(e); 

    var doc = new XDocument(); 
    doc.Add(new XElement("PictureBoxes", 
     this.Controls.Where(c => c.GetType() == typeof(PictureBox)) 
      .Select(pb => new XElement(pb.Name, 
       new XElement("SizeWidth", pb.Size.Width), 
       new XElement("location", pb.Location.X))))); 
    doc.Save("path/to/xml/file"); 
} 
+0

ありがとうございます。しかし、親ノードの名前を取得するにはどうすればいいですか? ''ノード。 – crimson589

+0

nvm、私はそれを得た。それは 'element.Name.LocalName'です – crimson589

関連する問題