当前位置:编程学习 > C#/ASP.NET >>

正则解析一个HTML,将解析结果按一定格式存放。

一、示范HTML。
<x id="1">
    <x id="2" />
    <x id="3">
        AAA
    </x>
</x>
<x id="4" />
<x id="5">BBB</x>
<x id="6" />

二、标签类型。
1、成对标签开始:<x id="1">
2、成对标签结束:</x>
3、独立标签:<x id="1" />
三、存放格式。

ID Parent Level StartStart StartEnd EndStart EndEnd Single Error   TxtAll             TxtInner
1  0     0      0          10       71       75     false  false   <x id="1">...</x>  ...
2  1     1      ..         ..       ..       ..     ..                                ...
...

各字段的注释:
·ID,对各种标签的编号。
·Parent,根据此生成dom树。
·Level,标签层级数。
·StartStart,起始标签(在整个HTML文档中)的开始位置。如:<x id="1">
·StartEnd,起始标签(在整个HTML文档中)的结束位置。如:<x id="1">
·EndStart,结束标签(在整个HTML文档中)的开始位置。如:</x>
·EndEnd,结束标签(在整个HTML文档中)的开始位置。如:</x>
·Single,是否独立标签。
·Error,标签不成对时标记错误。
·TxtAll,标签整块。如:<x id="1">XYZ<x id="2">ABC</x>123</x>整块。
·TxtInner,标签内块。如:<x id="1">XYZ<x id="2">ABC</x>123</x>中的XYZ<x id="2">ABC</x>123。
四、说明。
1、不用第三方dom解析组件。
2、程序已经实现了ID、Parent、Level等并形成树,只有部分参数的存放没实现,如:EndStart、TxtAll等。
3、具体的程序请向我索取。QQ:1628354540。 --------------------编程问答-------------------- 楼主是有钱人呀 --------------------编程问答-------------------- 不有钱了,因为积分不够了,不好意思请人白帮忙了,谢谢你顶我。 --------------------编程问答-------------------- 这个最好用Html解析,为啥不用插件

用正则太麻烦了,况且页面比较复杂的话就更难满足你的需求,
Winista.Htmlparser.Net你可以了解一下 --------------------编程问答-------------------- Winista.Htmlparser.Net用过了,不行,他会自动添加缺失的标签导致标签不准确。
我用正则实现的,速度比Winista.Htmlparser.Net快上20-30倍,基本上需要的都实现了,就差后面的几个小步骤。 --------------------编程问答-------------------- 这不是正则干的活,无法取到字符串在整个HTML文档中的位置,即你所说的行号 --------------------编程问答-------------------- 晕,正则可以取到的:
mc[i].Groups[0].Index:就是某个匹配字符串在整个html文档起始位置。
mc[i].Groups[0].Index + mc[i].Groups[0].Value.Length:就是字符串在整个html文档结束位置。
--------------------编程问答-------------------- 你确定格式肯定不超出示例的范畴?那我试试用xml序列化,实现会更加清晰。 --------------------编程问答-------------------- 不知道下面这样的格式,是否超出html范围?
如果只考虑自定义标签,就没有超出。
如果要考虑标准的html,那就已经超出dom的范围了。
不知道下面的html,是否超出?
<div <x:if exp="1=1">class="active"</x:if>>
</div> --------------------编程问答-------------------- 嗯,如果直接用XML反序列化是不可能的了,不过可以使用XML序列化原理来自定义一个反序列化过程,参考IXmlSerializable接口的ReadXml方法,自定义一个类,继承IXmlSerializable,实现ReadXml,你会发现一切都是那么的清晰。你先网上或MSDN上搜索下如何自己实现IXmlSerializable接口,肯定会对你的这个解析大有帮助的。 --------------------编程问答-------------------- 我是用正则完成的,其实也是非常简单的。
即使你用ixml来完成,也回避不了我所需求的问题。 --------------------编程问答-------------------- IIS设为本地服务模式就可以了。 --------------------编程问答-------------------- 坐等大神来解答 --------------------编程问答-------------------- 能否加我的Q号?我传DEMO过来。 --------------------编程问答-------------------- 帮顶 --------------------编程问答--------------------
引用 6 楼 wtoeb 的回复:
晕,正则可以取到的:
mc[i].Groups[0].Index:就是某个匹配字符串在整个html文档起始位置。
mc[i].Groups[0].Index + mc[i].Groups[0].Value.Length:就是字符串在整个html文档结束位置。

这样只是取到 字符串在整个中的index,这个我还是知道的.
我指的是html左侧的行号
可能是我理解错了你的意思 --------------------编程问答-------------------- 如果你不着急,我可以过2天看看,现在比较忙,所以先给你点思路,你看看是否可以那么做。正则不是不能做到,只不过正则思路不怎么清晰,如果html标签完全符合xml规范,首尾标签都有,加载到XmlDocument可以成功,那么就可以按照Xml对象来处理,这样你只要判断内部节点,通过递归法就可以查找整个Xml对象了。前面所说的反序列化也只是一种手段,你当作是处理Xml文档就可以了。正则去匹配的话,首尾标签闭合处理的匹配会比较麻烦,因为你都不知道有多少级数。 --------------------编程问答-------------------- 噢,问题还是不少的,还有很多细节要调整。
过路的兄弟帮我顶一下,谢谢。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,