求XML解析成HTML的代码,支持嵌套!

ttyp 2004-09-26 10:31:03
需要把元素全部转换成服务端的控件
...全文
261 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
menglionel 2004-09-28
  • 打赏
  • 举报
回复
up
20040216 2004-09-27
  • 打赏
  • 举报
回复
xslt有循环语法
ttyp 2004-09-27
  • 打赏
  • 举报
回复
谢谢老大(f),反正用反射更简单,顺便也写个吧,我好整理下帖出来:)
saucer 2004-09-27
  • 打赏
  • 举报
回复
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>
ttyp 2004-09-26
  • 打赏
  • 举报
回复
<?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
saucer 2004-09-26
  • 打赏
  • 举报
回复
show an example of XML, we will show you a way
happyjun2000 2004-09-26
  • 打赏
  • 举报
回复
用xsl来处理,网上找点资料。
ttyp 2004-09-26
  • 打赏
  • 举报
回复
就是这没想明白,给点提示
saucer 2004-09-26
  • 打赏
  • 举报
回复
same idea, just keep the parent control around, or use a stack to keep track of controls created
ttyp 2004-09-26
  • 打赏
  • 举报
回复
to saucer(思归):要支持嵌套,好象要麻烦点
ttyp 2004-09-26
  • 打赏
  • 举报
回复
我要做自定义的表单,用XML定义HTML元素,最后取HTML的元素中内容提交,涉及到TABLE排版,TextBox控件和DropDownList控件等
saucer 2004-09-26
  • 打赏
  • 举报
回复
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);


}
}
}
ttyp 2004-09-26
  • 打赏
  • 举报
回复
XSL可以实现服务端的么?
BearRui 2004-09-26
  • 打赏
  • 举报
回复
利用XSL,可以参考CSDN本身的例子:

http://community.csdn.net/expert/Xsl/2.xsl

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧