代码之家  ›  专栏  ›  技术社区  ›  jay_t55

读取和处理XML文件

  •  4
  • jay_t55  · 技术社区  · 15 年前

    我有一个XML文件。其格式如下:

    ControlType > Content > LocationX > LocationY > ForeColor/LinkColor > Int > Int > Int > Int
    

    文件示例:

    <?xml version="1.0" encoding="utf-8"?>
    <cs>
      <Label Content="Double-click to edit." LocationX="583" LocationY="254" A="255" R="255" G="255" B="255" />
      <LinkLabel Content="Double-click to edit." LocationX="613" LocationY="251" A="255" R="0" G="0" B="0" />
    </cs>
    

    背景:生成一个XML文件并保存在磁盘上。当用户将XML文档加载到我的应用程序中时,我的应用程序将读取XML文件。对于文档中的foreach控件,它将检索其属性,如下所示:

    foreach(Control control in XmlFile)
    {
         // get control type
         // get control content
         // get LocationX
         // get LocationY
         // get Color
         // get Int
         // get Int
         // get Int
         // get Int
    
         // Do something with retrieved data.
    }
    

    我已经有了:

    OpenFileDialog o = new OpenFileDialog();
    
    o.Filter =
        "T Multimedia Format (*.mf)|*.mf|" +
        "Word Document (*.docx)|*.docx|" +
        "PDF Document (*.pdf)|*.pdf|" +
        "Text FIle (*.txt)|*.txt";
    o.Title = "T 11 - Open Document";
    
    using (o)
    {
        if (o.ShowDialog() == DialogResult.OK)
        {
            XDocument xdc = XDocument.Load(o.FileName);
    
            var cs = xdc.Elements("cs");
            foreach (var im in cs)
            {
                if (im.Name == "Label")
                {
                    Label label = new Label();
                    label.MouseClick += new MouseEventHandler(label_MouseClick);
                    label.MouseDown += new MouseEventHandler(label_MouseDown);
                    label.MouseMove += new MouseEventHandler(label_MouseMove);
                    label.MouseUp += new MouseEventHandler(label_MouseUp);
                    label.MouseDoubleClick += new MouseEventHandler(label_MouseDoubleClick);
    
                    label.Text = im.Attribute("Content").Value;
    
                    label.Location = new Point(
                        Convert.ToInt32(im.Attribute("LocationX").Value),
                        Convert.ToInt32(im.Attribute("LocationY").Value));
    
                    label.BackColor = Color.Transparent;
                    label.ForeColor = Color.FromArgb(
                        Convert.ToInt32(im.Attribute("A").Value),
                        Convert.ToInt32(im.Attribute("R").Value),
                        Convert.ToInt32(im.Attribute("G").Value),
                        Convert.ToInt32(im.Attribute("B").Value));
    
                    label.AutoSize = true;
                    Canvas.Controls.Add(label);
    
                    label.BringToFront();
                }
                else if (im.Name == "LinkLabel")
                {
                    LinkLabel link = new LinkLabel();
                    link.MouseClick += new MouseEventHandler(link_MouseClick);
                    link.MouseDown += new MouseEventHandler(link_MouseDown);
                    link.MouseMove += new MouseEventHandler(link_MouseMove);
                    link.MouseUp += new MouseEventHandler(link_MouseUp);
                    link.MouseDoubleClick += new MouseEventHandler(link_MouseDoubleClick);
    
                    link.Text = im.Attribute("Content").Value;
    
                    link.Location = new Point(
                        Convert.ToInt32(im.Attribute("LocationX").Value),
                        Convert.ToInt32(im.Attribute("LocationY").Value));
    
                    link.BackColor = Color.Transparent;
                    link.LinkColor = Color.FromArgb(
                        Convert.ToInt32(im.Attribute("A").Value),
                        Convert.ToInt32(im.Attribute("R").Value),
                        Convert.ToInt32(im.Attribute("G").Value),
                        Convert.ToInt32(im.Attribute("B").Value));
    
                    link.AutoSize = true;
                    Canvas.Controls.Add(link);
    
                    link.BringToFront();
                }
            }
        }
    }
    

    …上面的代码产生零错误。但是,它就是不起作用。表单上没有显示任何控件。有人知道上面的代码为什么不起作用吗?我怎么能让它起作用呢?

    谢谢你的帮助

    巴尔

    1 回复  |  直到 12 年前
        1
  •  3
  •   Darin Dimitrov    15 年前

    我建议你用一种更通用的方法:

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (var controlTag in XDocument.Load("settings.xml").Root.Elements())
        {
            var controlType = Type.GetType(string.Format("System.Windows.Forms.{0}, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", controlTag.Name.LocalName), false);
            if (controlType == null || !typeof(Control).IsAssignableFrom(controlType))
            {
                continue;
            }
            var control = (Control)Activator.CreateInstance(controlType);
            control.Text = controlTag.Attribute("Content").Value;
            control.Location = new Point(
                int.Parse(controlTag.Attribute("LocationX").Value),
                int.Parse(controlTag.Attribute("LocationY").Value)
            );
            control.BackColor = Color.Transparent;
    
            control.MouseClick += mouseClick;
            control.MouseDown += mouseDown;
            control.MouseMove += mouseMove;
            control.MouseUp += mouseUp;
            control.MouseDoubleClick += mouseDoubleClick;
    
            Controls.Add(control);
        }
    
    }
    

    至于颜色,您可以向XML文件添加一个属性,该属性将指向要设置和使用反射的控件的属性名。例如:

    <?xml version="1.0" encoding="utf-8"?>
    <cs>
      <Label Content="Double-click to edit." LocationX="583" LocationY="254" A="255" R="255" G="255" B="255" ColorProperty="ForeColor" />
      <LinkLabel Content="Double-click to edit." LocationX="613" LocationY="251" A="255" R="0" G="0" B="0" ColorProperty="LinkColor" />
    </cs>
    

    顺便说一下,XAML已经提供了您在这里试图实现的许多功能。当然,它假定的是WPF接口,这可能不是您的情况。