将XML属性加载到c#winform

时间:2014-09-01 08:41:32

标签: c#

我有这个xml文件,其结构如下:

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

我需要解析它,然后我需要保存数据并在表单中创建多个文本框。

我需要使用LABEL作为标签,使用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文件中的maby值相比而不仅仅是5?

2 个答案:

答案 0 :(得分: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;

在for内设置标签和文本框名称。

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

答案 1 :(得分: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++;
}