c++编写html文件解析器
最近本来是要去那嵌入式课的,但是那课竟然说人数太少,开不了,靠。所以这两天只能自己研究点东西了。记得自己以前就想动手写一个关于dom的解析引擎,只怪自己太懒,一直没动笔。最近在家也没什么事做,就自己动手写一个,花了一天时间写的差不多了,正好锻炼自己的c++水平吧。
这个解析程序有三个类,node,nodecollect,dom。dom这个类是个包装,它就相当与document吧,nodecollect是节点的集合,比如getelementsbytagname的返回集合吧,node类就是具体到节点。这个程序解析的原理就是解析一段html字符串,在里面提取节点,然后用链表存储节点,node类有两个私有对象,start,len。start就是该节点字符串到原始字符串的位置,len即使该节点字符串的长度。所以我们根据该节点的start和len就可以定位该节点在原始字符串的位置。
好了,下面看代码:
#include<iostream>
using namespace std;
class node;
class dom;
class nodecollect{
private:
node *n;
int length;
public:
nodecollect();
~nodecollect();
int getlength();
node* item(int i);
void add(node *nn);
};
class node{
private:
int start;
int len;
public:
char* innerhtml(dom& d);
char* outerhtml(dom& d);
char* innertext(dom& d);
char* getattr(dom& d,char* str);
char* tagname(dom& d);
node* getparent(dom &d);
nodecollect* getchild(dom &d);
node* getnext(dom &d);
node* getprevious(dom &d);
node *next;
void setstart(int i);
void setlen(int i);
int getstart();
int getlen();
};
class dom{
private:
char *text;
node *n;
int count;
int parse(char *s);
public:
~dom();
char *gettext();
void load(char *str);
node* getitem(int i);
int getcount();
node *getbyid(char* id);
nodecollect* getbytagname(char *tagname);
};
void dom::load(char* str){
n=0;
count=0;
int l=strlen(str
相关文档:
1、C/C++程序员请注意,不能在case语句不为空时“向下执行”。
2、值类型和引用类型之间的区别:C#的基本类型(int,char等)都是值类型,是在栈中创建的。而对象是引用类型,创建于堆中,需要使用关键字new。
3、在C#中通过实例访问静态方法或成员变量是不合法的,会生成编译器错误。但是我们可以通过声明他们 ......
1 创建C# DLL,需要指定应用类型为“类库”,代码:
namespace CSLib
{
public class Class1
{
private string name;
public string Name
......
众所周知,strcmp为字串比较只用,简单的函数并不简单。
下面的代码
int main()
{
char* cp1 = {'z', 'h', 'a', 'n', 'g'};
char* cp2 = {'z', 'h', 'a', 'n', 'g'};
std::cout<<strcmp(cp1, cp2)<< ......
<map name="Map4" id="Map4">
<area shape="rect" mce_shape="rect" coords="659,31,697,45" mce_coords="659,31,697,45" href="product/?keys=289" mce_href="product/?keys=289" />
</map>
<map name=" ......