2014-09-01 26 views
0

我有具有這樣的結構,該XML文件:加載XML屬性,C#的winform

<MACHINE> 
<CONTROL NAME="" LABEL="TEST1" LABEL1="TEST1"/> 
<CONTROL NAME="" LABEL="TEST2" LABEL1="TEST2"/> 
<CONTROL NAME="" LABEL="TEST3" LABEL1="TEST3"/> 
</MACHINE> 

我需要解析它,那麼我就需要多個文本框保存數據,並創建形式。

我需要使用標籤爲標籤和LABEL1的名稱爲文本框

我試圖解析它是這樣的:

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(@"C:projects.xml"); 
XmlNodeList list = xdoc.SelectNodes("//MACHINE"); 

但我不知道怎麼走的更遠。

我已經添加了這些代碼生成一些文本框

var n = 5; 
for (int i = 0; i < n; i++) 
{ 
    for (int i = 0; i < n; i++) 
     { 
      //Create label 

      Label label = new Label(); 
      label.Text = String.Format("Label {0}", i); 
      //Position label on screen 
      label.Left = 10; 
      label.Top = (i + 1) * 20; 
      //Create textbox 
      TextBox textBox = new TextBox(); 
      //Position textbox on screen 
      textBox.Left = 120; 
      textBox.Top = (i + 1) * 20; 
      //Add controls to form 
      label.Name = list[i].Attributes["LABEL"].Value; 
      textBox.Name = list[i].Attributes["LABEL1"].Value; 
      this.Controls.Add(label); 
      this.Controls.Add(textBox); 
} 

我怎麼能修改此所以需要爲莫比值有從XML文件,而不是僅僅5?

回答

1

你的xml應該有適當的關閉元素。

<CONTROL NAME="" LABEL="TEST1" LABEL1="TEST1"></CONTROL> 

或者

<CONTROL NAME="" LABEL="TEST1" LABEL1="TEST1" /> 

你可以只選擇CONTROL,而不是MACHINE。您可以通過使用Count屬性來獲得CONTROL的計數。

變化

XmlNodeList list = xdoc.SelectNodes("//MACHINE"); 

進入

XmlNodeList list = xdoc.SelectNodes("//CONTROL"); 

然後設置

var n = list.Count; 

裏面的設置標籤和文本框的名字。

label.Name = list[i].Attributes["LABEL"].Value; 
textBox.Name = list[i].Attributes["LABEL1"].Value; 
+0

感謝鄒非常多的回覆,好,我更新,是這麼好嗎?我無法執行它 – 2014-09-01 08:55:37

+0

@AniAni,你檢查了xml字符串關閉元素嗎? 'for'語法似乎在您更新的問題中被重複。並將'// MACHINE'改爲'// CONTROL'並設置'var n = list.Count;' – 2014-09-01 08:57:29

+0

yes是的,謝謝我的確如此,但我仍然得到不同的標籤名稱,例如Label 1,Label 2和等等,但它計數行 – 2014-09-01 08:58:48

0

我會建議你嘗試LINQ to XML

var root = XElement.Load(@"c:\projects.xml"); 
var controlElements = root.Descendants("CONTROL"); 

int labelCounter = 1; 
foreach (var element in controlElements) 
{ 
    var labelId = (string) element.Attribute("LABEL"); 
    var textBoxName = (string) element.Attribute("LABEL1"); 

    Label label = new Label(); 
    label.Text = string.Format("Label {0}", labelCounter); 

    label.Left = 10; 
    label.Top = (labelCounter + 1) * 20; 

    TextBox textBox = new TextBox(); 

    textBox.Left = 120; 
    textBox.Top = (labelCounter + 1) * 20; 

    this.Controls.Add(label); 
    this.Controls.Add(textBox); 

    labelCounter++; 
}