开发者

XML Files To Web Form with .net

开发者 https://www.devze.com 2023-01-30 11:18 出处:网络
now i am assigned to web project,that used asp.net mvc with c#. i need to load some XML file like below and that will tell which controls i need to create.

now i am assigned to web project,that used asp.net mvc with c#. i need to load some XML file like below and that will tell which controls i need to create. This also tells,type of controls,their value,size and location.i can't find the way how i do?please guide me right way.

 <Object type="System.Windows.Forms.Form" name="frmShow" >
  <Object type="System.Windows.Forms.RadioButton" name="optOne">    
    <Property name="Size">86, 24</Property>    
    <Property name="Text">Option1</Property>
    <Property name="Location">175, 126</Property>    
  </Object>

  <Object type="System.Windows.Forms.CheckBox" name="chkOne">
    <Property name="Siz开发者_如何学Ce">84, 24</Property>
    <Property name="Text">CheckOne</Property>
    <Property name="Location">84, 126</Property>  
  </Object>

  <Object type="System.Windows.Forms.TextBox" name="txtOne">
    <Property name="Size">177, 20</Property>
    <Property name="Text">ABC</Property>
    <Property name="Location">84, 88</Property>  
  </Object>

  <Object type="System.Windows.Forms.Label" name="lblOne">
    <Property name="Size">100, 23</Property>
    <Property name="Text">Name</Property>
    <Property name="Location">8, 91</Property>  
  </Object>

  <Object type="System.Windows.Forms.TextBox" name="txtTwo">
    <Property name="Size">177, 20</Property>
    <Property name="Text">Home Address</Property>
    <Property name="Location">84, 50</Property>    
  </Object>

  <Object type="System.Windows.Forms.Label" name="lblTwo">
    <Property name="Size">100, 23</Property>
    <Property name="Text">Address</Property>
    <Property name="Location">7, 53</Property>  
  </Object>

  <ItemDataSet>
    <ItemTable>      
      <TableName>tblItemOne</TableName>
      <Row1>
        <Repeat>True</Repeat>
        <ItemName>Item001</ItemName>
        <Qty>10</Qty>
        <Price>1000</Price>
      </Row1>
      <Row2>
        <Repeat>True</Repeat>
        <ItemName>Item002</ItemName>
        <Qty>20</Qty>
        <Price>2000</Price>
      </Row2>
      <Row3>
        <Repeat>false</Repeat>
      <ItemName>Item003</ItemName>
      <Qty>30</Qty>
      <Price>3000</Price>
      </Row3>      
    </ItemTable>    
  </ItemDataSet>

</Object>


This code creates a dictionary of controls. You can optimize it further if you need. Another alternative is to create a schema (xsd) based on the xml and then use XmlSerializer as suggested by @Jon Abaca. The XmlSerializer option is much simpler than this approach.

First approach (without XmlSerializer)

private Dictionary GetControlDictionary(string xmlFilePath)
{
    Dictionary controlsDictionary = new Dictionary();
    Assembly assembly = Assembly.GetAssembly(typeof(System.Windows.Forms.Form));    
    using (XmlReader xmlReader = XmlReader.Create(xmlFilePath))
    {
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(xmlReader);
        XmlNodeList xmlNodesList = xmlDocument.SelectNodes("//Object");                        
        foreach (XmlNode xmlNode in xmlNodesList)
        {
            if (xmlNode.Attributes.Count > 0)
            {
                string typeName = xmlNode.Attributes["type"].Value;
                string objectName = xmlNode.Attributes["name"].Value;
                Type controlType = assembly.GetType(typeName);
                if (controlType != null)
                {
                    object controlObject = Activator.CreateInstance(controlType);
                    if (controlObject is Control)
                    {
                        Control control = controlObject as Control;
                        control.Name = objectName;
                        controlsDictionary.Add(objectName, control);
                        foreach (XmlNode childNode in xmlNode.ChildNodes)
                        {
                            if (string.Equals("Property", childNode.Name))
                            {
                                string propertyName = childNode.Attributes["name"].Value;
                                string propertyValue = childNode.InnerText;
                                PropertyInfo propertyInfo = controlType.GetProperty(propertyName);
                                if (propertyInfo != null)
                                {
                                    if(propertyInfo.PropertyType == typeof(System.Drawing.Size))
                                    {
                                        string width = propertyValue.Split(new char[] {','})[0];
                                        string height = propertyValue.Split(new char[] {','})[1];
                                        System.Drawing.Size size = new Size(Convert.ToInt32(width), Convert.ToInt32(height));
                                        propertyInfo.SetValue(control, size, null);
                                    }
                                    else if(propertyInfo.PropertyType == typeof(System.Drawing.Point))
                                    {
                                        string x = propertyValue.Split(new char[] { ',' })[0];
                                        string y = propertyValue.Split(new char[] { ',' })[0];                                        System.Drawing.Point point = new Point(Convert.ToInt32(x), Convert.ToInt32(y));
                                        propertyInfo.SetValue(control, point, null);
                                    }
                                    else if (propertyInfo.PropertyType == typeof(string))
                                    {
                                        propertyInfo.SetValue(control, propertyValue, null);
                                    }
                                }
                            }
                        }
                    }                            
                }
            }
        }
    }

    return controlsDictionary;
}


Try to convert this scala code for C# or even you can consume the Scale in c# Refer to http://code.google.com/p/xsd-forms/

Also you can use XSLTViewEngine

XSD Form built based on Scala

0

精彩评论

暂无评论...
验证码 换一张
取 消