【问题标题】:XML Files To Web Form with .net使用 .net 将 XML 文件转换为 Web 表单
【发布时间】:2012-06-18 20:42:21
【问题描述】:

现在我被分配到使用 c# 的 asp.net mvc 的 web 项目。 我需要加载一些如下所示的 XML 文件,这将告诉我需要创建哪些控件。 这也说明了控件的类型、它们的价值、大小和位置。我找不到我该怎么做?请指导我正确的方式。

 <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="Size">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>

【问题讨论】:

  • 它可能是一个被序列化为 xaml 的网络表单。尝试反序列化它。
  • 你能详细解释一下吗?其实我对webform不熟悉。请给我一些例子或链接,谢谢。
  • XmlSerializer 可以将对象转换为 XML。您的 XML 可能是一个已序列化的对象。如果是,您可以反序列化 XML,并将其转换为对象。情况可能并非如此,但值得一看。 msdn.microsoft.com/en-us/library/…

标签: c# xml


【解决方案1】:

此代码创建一个控件字典。如果需要,您可以进一步优化它。 另一种选择是基于 xml 创建一个模式(xsd),然后按照@Jon Abaca 的建议使用 XmlSerializer。 XmlSerializer 选项比这种方法简单得多。

第一种方法(没有 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;
}

【讨论】:

    【解决方案2】:

    尝试将此 scala 代码转换为 C# 或者甚至可以在 c# 中使用 Scale 参考 http://code.google.com/p/xsd-forms/

    你也可以使用XSLTViewEngine

    XSD Form built based on Scala

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多