读取一个格式良好的XML文档,并按层次编号并输出
#include
#include
#include
#include
#define BUFSIZE 30
//XML文档结点
struct Node
{
int num; //结点编号
char name[BUFSIZE]; //结点名
char value[BUFSIZE]; //结点值
Node *parent; //父结点;
Node *lsibling; //左同胞结点
Node *rsibling; //右同胞结点
Node *firstChild; //第一个子结点
Node *lastChild; //最后一个子结点
int childCount; //Examda提示: 子结点个数,这个可以不要,有这个要方便些,在插入和删除子结点时要维护
};
//从文件中读一个字符串,直到读到标记符为此
void ReadString(FILE *fp, char *buf)
{
char ch;
char *p = buf;
ch = fgetc(fp);
do
{
if (p != buf || !isspace(ch)) //自动去掉首部空白
{
*(p++) = ch;
}
ch = fgetc(fp);
}while (!feof(fp) && (ch != ' {
fseek(fp, -1, SEEK_CUR);
p--;
}
else if ('>' == ch)
{
*p = ch;
}
//以下代码为去掉buf的尾空白
while (p != buf && isspace(*p)) p--;
*(++p) = '\0';
}
//从文件中读取一个结点及其所有子结点
void ReadNode(FILE *fp, Node *node)
{
char buf[BUFSIZE];
Node *child = NULL; //当前子结点
ReadString(fp, buf); //读入开始标记
strcpy(node->name, &buf[1]); //只拷贝标记正文
node->name[strlen(node->name) - 1] = '\0';
while (1)
{
buf[0] = '\0';
ReadString(fp, buf); //读入下一个字符串
if ('
0条评论