首先我希望是对于HTML结构理解比较深刻的前辈进来看看
最好是理解C#的 因为我现在有一个需求是这样的。
有类似这样的HTML字符串代码 其中有若干Col标签 我需要获取Col标签中的宽度 可能有两种(一是style="width:90px",二是width=90px)
然后赋值给相应的TD.不能使用将HTML字符串转换成XML来做 提示一下 使用递归。我这个需求难住我了 逻辑很简单 但是实现起来确实有点麻烦 希望前辈们支招 给出代码的最好 我一般没伸手党过 谢谢!
HTML字符串如下
<table cellspacing=0 cellpadding=0 width='100%'><tr><td><table valign='top' cellspacing='0' cellpadding='0' border='0' width='100%'><tr><td><table valign='top' cellspacing=0 cellpadding=0 class='secTable' width='100%' height='1%' style='display:block;'><tr valign='top'><td class='formCell' colspan='2'><table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'><col style='width:90px'/><col/><tr><td class='cellLabel' >名称:</td><td class='relatedInfoContent'>aaaaaa</td></tr></table></td></tr><tr valign='top'><td class='formCell'><table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'><col style='width:90px'/><col style='width:100px;' /><col /><tr><td colspan='2' class='cellLabel' >客户:</td><td class='relatedInfoContent'>Aaronrdg</td></tr></table></td><td class='formCell'><table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'><col style='width:90px'/><col/><tr><td class='cellLabel' >报价人:</td><td class='relatedInfoContent'>檀庭</td></tr></table></td></tr><tr valign='top'><td class='formCell'><table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'><col style='width:90px'/><col/><tr><td class='cellLabel' >报价时间:</td><td class='relatedInfoContent'>2013-10-29 16:41</td></tr></table></td><td class='formCell'><table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'><col style='width:90px'/><col/><tr><td class='cellLabel' style='text-align:0;'></td><td class='relatedInfoContent'></td></tr></table></td></tr></table></td></tr></table></td></tr><tr><td><table valign='top' cellspacing='0' cellpadding='0' border='0' width='100%'><tr height='18'><td class='sec bar'>商品清单</td></tr><tr height=5><td></td></tr><tr><td><table valign='top' cellspacing=0 cellpadding=0 class='secTable' width='100%' height='100%' style='display:block;'><col width='50%'/><col width='50%'/><tr valign='top' height='100%'><td class='formCell' colspan='2'><table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:115px;'><col/><tr><td class='relatedInfoContent' style='padding-bottom:3px;'><table class='printTable' border='0' cellspacing='0' cellpadding='3'><tr><td class='printTdHeader' width='125' align='left'>描述</td><td class='printTdHeader' width='125' align='left'>规格</td><td class='printTdHeader' width='50' align='left'>数量</td><td class='printTdHeader' width='75' align='left'>单价 (¥)</td><td class='printTdHeader' width='75' align='left'>小计 (¥)</td></tr><tr><td class='printTd' align='left'>成本测试</td><td class='printTd' align='left'>成本测试规格1</td><td class='printTd' align='left'>2.00</td><td class='printTd' align='left'>¥2,614.40</td><td class='printTd' align='left'>¥5,228.80</td></tr><tr><td class='printTd' align='left'>校园网站标准版</td><td class='printTd' align='left'> </td><td class='printTd' align='left'>2.00</td><td class='printTd' align='left'>¥33.00</td><td class='printTd' align='left'>¥66.00</td></tr><tr><td class='printTd' align='left'>成本测试</td><td class='printTd' align='left'>成本测试规格2</td><td class='printTd' align='left'>1.00</td><td class='printTd' align='left'>¥3,300.00</td><td class='printTd' align='left'>¥3,300.00</td></tr><tr><td class='printTd' align='left'>参数5</td><td class='printTd' align='left'> </td><td class='printTd' align='left'>1.00</td><td class='printTd' align='left'>¥1.00</td><td class='printTd' align='left'>¥1.00</td></tr><tr><td class='printTd' align='left'>参数8</td><td class='printTd' align='left'> </td><td class='printTd' align='left'>1.00</td><td class='printTd' align='left'>¥2.00</td><td class='printTd' align='left'>¥2.00</td></tr><tr><td class='printTd' align='left'>参数9</td><td class='printTd' align='left'> </td><td class='printTd' align='left'>1.00</td><td class='printTd' align='left'>¥4.00</td><td class='printTd' align='left'>¥4.00</td></tr><tr><td class='printTd' align='left'>总价</td><td class='printTd' align='left'> </td><td class='printTd' align='left'>0.00</td><td class='printTd' align='left'>¥0.00</td><td class='printTd' align='left'>¥8,601.80</td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table>
我明白你的意思,之前帮同事写过类似的代码,我特地帮你写了个例子,你去看看:http://runjs.cn/detail/mionbp9z
还真是类似的问题 不过我那个只是一个简单的HTML字符串 实际情况可能复杂点
这个换成C# 该怎么还- - JQ自己封装了太多东西。
@何小宝: 给你个思路, C# 可以将html片段转换成document对象,然后就可以类似操作dom一样操作元素了。
@袁家小黑球: 回复小黑球。谢谢一直关注 其实使用XML的方式已经实现了。就是你说的Document对象。
只不过现在上司说XML那种方式可能不是很通用。他的意思是使用直接操作字符串这种方式通用性上考虑的。
这个东西我还在思考 思路需要拟清楚 其实不难 就是逻辑比较繁琐一点。
@何小宝: 你正则用的熟练么? 我可以用正则帮你实现,不错处理的过程有点复杂而已,我说一下思路:
1. 利用正则匹配出,字符串中所有的table, 你会得到若干个table ,存储子啊MatchCollection中
2. 遍历 MatchCollection, 检查那些Table下面有col 元素,正则很容易判断出来,将这些Match 保存到一个新的数组中备用(加入放在TableMatchs这个变量中)
3. 利用正则,可以获取到Table的每一行tr中的特定的td的,也很容易获取对应的col ,这一步我说的简单,是因为,如果你很熟悉写正则,这步就不难的,配合正则的replace方法就可以了。
@何小宝: yuanjiaheiqiu@sina.cn 邮件给我,描述你遇到的问题,如果不是写起来太麻烦,我就帮你写了,呵呵
@袁家小黑球: 已发。
@袁家小黑球: 是不是不太好解决?
@何小宝: 我写的demo已经发送到你邮箱了,你理解一下。
@袁家小黑球: 给您发了一个邮件 您看看 我先把帖子结了
@袁家小黑球:
前辈 你的例子我看了 我还是没能实现 能否抽时间帮我完善一下呢。
好像用正则实现不了 我的需求 我看了思路
@何小宝: 这2天有点忙,具体遇到啥问题了?
没明白你的问题,代码最好是能格式化一下然后用插入代码的方式贴进来,或者把你最终的效果截个图下来,这样好理解你的问题一些。
<table cellspacing=0 cellpadding=0 width='100%'>
<tr>
<td>
<table valign='top' cellspacing='0' cellpadding='0' border='0' width='100%'>
<tr>
<td>
<table valign='top' cellspacing=0 cellpadding=0 class='secTable' width='100%' height='1%' style='display:block;'>
<tr valign='top'>
<td class='formCell' colspan='2'>
<table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'>
<col style='width:90px'/><col/>
<tr>
<td class='cellLabel'>
名称:
</td>
<td class='relatedInfoContent'>
aaaaaa
</td>
</tr>
</table>
</td>
</tr>
<tr valign='top'>
<td class='formCell'>
<table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'>
<col style='width:90px'/><col style='width:100px;'/><col/>
<tr>
<td colspan='2' class='cellLabel'>
客户:
</td>
<td class='relatedInfoContent'>
Aaronrdg
</td>
</tr>
</table>
</td>
<td class='formCell'>
<table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'>
<col style='width:90px'/><col/>
<tr>
<td class='cellLabel'>
报价人:
</td>
<td class='relatedInfoContent'>
檀庭
</td>
</tr>
</table>
</td>
</tr>
<tr valign='top'>
<td class='formCell'>
<table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'>
<col style='width:90px'/><col/>
<tr>
<td class='cellLabel'>
报价时间:
</td>
<td class='relatedInfoContent'>
2013-10-29 16:41
</td>
</tr>
</table>
</td>
<td class='formCell'>
<table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:100%;'>
<col style='width:90px'/><col/>
<tr>
<td class='cellLabel' style='text-align:0;'>
</td>
<td class='relatedInfoContent'>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table valign='top' cellspacing='0' cellpadding='0' border='0' width='100%'>
<tr height='18'>
<td class='sec bar'>
商品清单
</td>
</tr>
<tr height=5>
<td>
</td>
</tr>
<tr>
<td>
<table valign='top' cellspacing=0 cellpadding=0 class='secTable' width='100%' height='100%' style='display:block;'>
<col width='50%'/><col width='50%'/>
<tr valign='top' height='100%'>
<td class='formCell' colspan='2'>
<table cellpadding='0' cellspacing='0' border='0' style='width:100%;height:115px;'>
<col/>
<tr>
<td class='relatedInfoContent' style='padding-bottom:3px;'>
<table class='printTable' border='0' cellspacing='0' cellpadding='3'>
<tr>
<td class='printTdHeader' width='125' align='left'>
描述
</td>
<td class='printTdHeader' width='125' align='left'>
规格
</td>
<td class='printTdHeader' width='50' align='left'>
数量
</td>
<td class='printTdHeader' width='75' align='left'>
单价 (¥)
</td>
<td class='printTdHeader' width='75' align='left'>
小计 (¥)
</td>
</tr>
<tr>
<td class='printTd' align='left'>
成本测试
</td>
<td class='printTd' align='left'>
成本测试规格1
</td>
<td class='printTd' align='left'>
2.00
</td>
<td class='printTd' align='left'>
¥2,614.40
</td>
<td class='printTd' align='left'>
¥5,228.80
</td>
</tr>
<tr>
<td class='printTd' align='left'>
校园网站标准版
</td>
<td class='printTd' align='left'>
</td>
<td class='printTd' align='left'>
2.00
</td>
<td class='printTd' align='left'>
¥33.00
</td>
<td class='printTd' align='left'>
¥66.00
</td>
</tr>
<tr>
<td class='printTd' align='left'>
成本测试
</td>
<td class='printTd' align='left'>
成本测试规格2
</td>
<td class='printTd' align='left'>
1.00
</td>
<td class='printTd' align='left'>
¥3,300.00
</td>
<td class='printTd' align='left'>
¥3,300.00
</td>
</tr>
<tr>
<td class='printTd' align='left'>
参数5
</td>
<td class='printTd' align='left'>
</td>
<td class='printTd' align='left'>
1.00
</td>
<td class='printTd' align='left'>
¥1.00
</td>
<td class='printTd' align='left'>
¥1.00
</td>
</tr>
<tr>
<td class='printTd' align='left'>
参数8
</td>
<td class='printTd' align='left'>
</td>
<td class='printTd' align='left'>
1.00
</td>
<td class='printTd' align='left'>
¥2.00
</td>
<td class='printTd' align='left'>
¥2.00
</td>
</tr>
<tr>
<td class='printTd' align='left'>
参数9
</td>
<td class='printTd' align='left'>
</td>
<td class='printTd' align='left'>
1.00
</td>
<td class='printTd' align='left'>
¥4.00
</td>
<td class='printTd' align='left'>
¥4.00
</td>
</tr>
<tr>
<td class='printTd' align='left'>
总价
</td>
<td class='printTd' align='left'>
</td>
<td class='printTd' align='left'>
0.00
</td>
<td class='printTd' align='left'>
¥0.00
</td>
<td class='printTd' align='left'>
¥8,601.80
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
格式化了 最终效果就是
COL标签的宽度 最终赋值给它下面的对应的TD ?这样可以明白吗?前辈
如果你在网页上要处理的化.直接用jquery.遍历
$("td").attr("style","");
如果你在页面上,请使用这个:http://www.cnblogs.com/Ivony/p/3447536.html
(里面有api,你看着办)
这个满足不了我的需求 好像没有补全的功能 纠错倒是有
你这个相应的td,规则是什么?其实用Jquery比较容易实现的。
首先谢谢你的回复 ,因为我需要作为一个工具类文件类文件来使用 所以不考虑服务端语言实现。
环境是asp.net .
没有规则 就是我以上描述的 其实这个转换为XML结构很好实现 但是我们老大说 试着不用XML
一层一层的寻找替换。所以我想尽力试试
您也可以从简单的考虑一下 比如
这个
<table width="100%" border="1">
<col width="90px" />
<col style="width:90px" />
<col width="90px" />
<tr>
<th>
ISBN
</th>
<th>
Title
</th>
<th>
Price
</th>
</tr>
<tr>
<td>
3476896
</td>
<td>
My first HTML
</td>
<td>
$53
</td>
</tr>
</table>
这是一个简单的带有COL的table 我需要取得Col中的宽度 然后再赋值给它下面的TD.
这段代码最终结果就是
<table width="100%" border="1">
<col width="90px" />
<col style="width:90px" />
<col width="90px" />
<tr>
<th width="90px">
ISBN
</th>
<th style="width:90px">
Title
</th>
<th width="90px">
Price
</th>
</tr>
<tr>
<td width="90px">
3476896
</td>
<td style="width:90px">
My first HTML
</td>
<td width="90px">
$53
</td>
</tr>
</table>
红色部分COL 标签可以去除了 因为COL标签对应的是一列的TD 这样可以看明白么。 col个数不定 难点在于
第一 是打散字符串 第二是替换 第三是合并。
@何小宝: 直接找col,然后从col开始,找table,在这之中利用字符串查找,挨个替换。
@幻天芒: 能给出实现代码么 感觉这不是三言两语的事。。你指的直接找Col 是指先筛选出所有的Col还是??
@何小宝: 一个一个找:找到一个col之后,从这个startIndex找</table>,然后在这个内部做替换,接下来从</table>的索引找下一个col,同样的方式去做。
jquery获取所有宽度为90px的列,然后遍历循环赋值不行么。
90只是我写的一个固定的值 实际上的需求是 可能每一列的宽度不定。
谢谢你的回复 但是我需要用c#来实现 JQ不考虑。 个人情况不一样哈。
这个东西我搞出来写篇日记。确实网上没有人这样处理过。
@何小宝: 那用正则呢,你这个需求最主要的就是处理这些字符串的吧。。如果不用jq用c#程序去做,那就考虑用正则处理吧。
@Rookier:
- - 谢谢回复 我目前正在用正则尝试实现 之前有一个前辈给了例子 不过我还得自己修改。其实思路有点不对。我的这个字符串可能会出现Table嵌套的情况 我目前之实现了一个table的Col替换。
这个小问题折腾我2-3天了