需要把元素全部转换成服务端的控件

解决方案 »

  1.   

    利用XSL,可以参考CSDN本身的例子:http://community.csdn.net/expert/Xsl/2.xsl
      

  2.   

    what is your purpose? if  you need to create controls on the fly based on an xml file, use a XmlTextReader, for example, if you have...<control type="textbox" Text="abc" />
    <control type="button" Text="abc" />
    ...you could do something like (pseudo code)XmlTextReader xtr = new XmlTextReader(....);
    while (xtr.Read())
    {
      if (xtr.NodeType == XmlNodeType.Element)
      {
            if (xtr.LocalName == "control")
            {
                  Control c = null;
                  switch(xtr.GetAttribute("type"))
                  {
                        case "textbox":                          c = new TextBox();
                              break;                    case "button":                          c = new Button();
                              break;               }               if (c != null)
                      form1.Controls.Add(c);
             }
      }
    }
      

  3.   

    我要做自定义的表单,用XML定义HTML元素,最后取HTML的元素中内容提交,涉及到TABLE排版,TextBox控件和DropDownList控件等
      

  4.   

    to saucer(思归):要支持嵌套,好象要麻烦点
      

  5.   

    same idea, just keep the parent control around, or use a stack to keep track of controls created
      

  6.   

    用xsl来处理,网上找点资料。
      

  7.   

    show an example of XML, we will show you a way
      

  8.   

    <?xml version="1.0" encoding="GB2312"?>
    <form>
    <table>
    <tr>
    <td>
    <label>请假人</label>
    </td>
    <td>
    <text field="a" name="proposer" width="100" height="20" multiLine="false" validation="" validation_name="" example="" max_len="10" can_be_null="false" >
    </text>
    </td>
    <td>
    <label>年龄</label>
    </td>
    <td>
    <text field="b" name="age" width="20" height="20" multiLine="false" validation="/d" validation_name="请输入数字" example="" max_len="0" can_be_null="false">
    </text>
    </td>
    </tr>
    <tr>
    <td>
    <label>性别</label>
    </td>
    <td colspan="3">
    <radio name="sex" field="c">
    <option>男</option>
    <option>女</option>
    </radio>
    </td>
    </tr>
    <tr>
    <td>
    <label>所在部门</label>
    </td>
    <td colspan="3">
    <select field="d" name="department" width="100" height="20" dropdown="true">
    <!--<option_datasource table="uds_department" text="name" value="id"></opotion_datasource>-->
    <option>市场部</option>
    <option>研发部</option>
    <option>财务部</option>
    <option>生产部</option>
    </select>
    </td>
    </tr>
    <tr>
    <td>
    <label>请假日期</label>
    </td>
    <td>
    <text field="e" name="date" width="20" height="20" multiLine="false" validation="" validation_name="请输入日期" example="" max_len="0" can_be_null="false">
    </text>
    </td>
    <td>
    <label>请假天数</label>
    </td>
    <td>
    <text field="f" name="days" width="20" height="20" multiLine="false" validation="/d" validation_name="请输入数字" example="" max_len="3" can_be_null="false">
    </text>
    </td>
    </tr>
    <tr>
    <td>
    <label>详细理由</label>
    </td>
    <td colspan="3">
    <text field="g" name="reason" width="200" height="150" multiLine="true" validation="" validation_name="" example="" max_len="0" can_be_null="true">
    </text>
    </td>
    </tr>
    <tr>
    <td>
    <label>爱好</label>
    </td>
    <td colspan="3">
    <check field="h" name="favorite">
    <option>唱歌</option>
    <option>跳舞</option>
    <option>游泳</option>
    </check>
    </td>
    </tr>
    </table>
    </form>//thx
      

  9.   

    it is ugly, you could use Reflection to use less methods, but performance could be an issue, try something like (you need to fill the rest for other controls):<%@ Import Namespace="System.IO" %>
    <%@ Import Namespace="System.Xml" %>
    <script language="C#" runat="server">
    void Page_Load(Object sender, EventArgs e)
    {
    string sFile = Server.MapPath("form.xml");
    StreamReader sr = new StreamReader(sFile, System.Text.Encoding.GetEncoding("GB2312"));
    XmlTextReader xtr = new XmlTextReader(sr);
    ProcessReader(xtr);
    sr.Close();
    }void ProcessReader(XmlTextReader reader)
    {
      while (reader.Read())
      {
    if (reader.NodeType == XmlNodeType.Element && reader.LocalName.ToLower() == "form")
    {
      ProcessForm( reader, Page);
    }
      }
    }void ProcessForm(XmlTextReader reader, Page p)
    {
      HtmlForm hf = new HtmlForm();
      hf.ID = "form1";
      p.Controls.Add(hf);  ProcessChildren(reader, hf, "form");
    }
    void ProcessTable(XmlTextReader reader, Control cParent)
    {
      Table t = new Table();
      cParent.Controls.Add(t);  ProcessChildren(reader, t, "table");
    }
    void ProcessTR(XmlTextReader reader, Table t)
    {
      TableRow tr = new TableRow();
      t.Rows.Add(tr);  ProcessChildren(reader,tr, "tr");
    }
    void ProcessTD(XmlTextReader reader, TableRow tr)
    {
      TableCell td = new TableCell();
      tr.Cells.Add(td);  ProcessChildren(reader, td, "td");
    }void ProcessLabel(XmlTextReader reader, Control c)
    {
      Label l = new Label();
      c.Controls.Add(l);
      l.Text = reader.ReadString();
    }void ProcessText(XmlTextReader reader, Control c)
    {
      TextBox tb = new TextBox();
      tb.ID = reader.GetAttribute("name");
      if (reader.GetAttribute("multiLine").ToLower()=="true")
    tb.TextMode = TextBoxMode.MultiLine;
      c.Controls.Add(tb);  //ProcessChildren(reader, tb, "text");
    }void ProcessChildren(XmlTextReader reader, Control c, string strParentTagName)
    {
      while (reader.Read())
      {
    if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName.ToLower() == strParentTagName)
    return; if (reader.NodeType == XmlNodeType.Element)
    {
    string str = reader.LocalName.ToLower();
    switch(str)
    {
    case "text":
    ProcessText(reader, c);
    break; case "label":
    ProcessLabel(reader, c);
    break; case "table":
    ProcessTable(reader, c);
    break; case "tr":
    ProcessTR(reader, (Table)c);
    break; case "td":
    ProcessTD(reader, (TableRow)c);
    break; }
    }
      }
    }
    </script>