解析xml
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了解析xml,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2656字,纯文字阅读大概需要4分钟。
内容图文
#include <vector>#define ch_not_spec(x) ((x) != ‘/‘ && (x) != ‘<‘ && (x) != ‘>‘)
struct XML_NODE
{
char name[64];
char* property_start;
char* property_end;
int over_type;
int type;
std::vector<XML_NODE*> child_list;
XML_NODE(char* name_cpy, int len, int cpy_type, char* prop_start, char* prop_end, int ovr_type): type(cpy_type),
property_start(prop_start), property_end(prop_end), over_type(ovr_type)
{
memcpy(name, name_cpy, len);
name[len] = 0;
}
};
//p为输入的待解析xml字符串;root为返回的xml数结构; last_node是最后一个成功被解析的xml节点,主要用于定位错误位置,解析相当于构建了一个 根 -先-后 的树,另外 假设< / >这三个字符是特殊标记字符 不能出现在属性或者其他地方,只能作为标记的一部分
bool visit_xml(char* p, XML_NODE* & root, XML_NODE* & last_node)
{
char* q, *s, *t;
std::vector<XML_NODE*> node_stack;
if(*p != ‘<‘)
return false;
while(*p != ‘\0‘)
{
if(*p == ‘<‘ && *(p + 1) != ‘/‘)//起始节点 <form xxxx> <form xxx />
{
q = p + 1;
while(*q != ‘\0‘ && *q != ‘ ‘ && ch_not_spec(*q))
++q;
if(q == p + 1)
return false;
s = q;
//跳过空格
while(*s == ‘ ‘)
++s;
t = s;
//获取属性字符串
while(*t != ‘\0‘ && ch_not_spec(*t))
++t;
if(*t == ‘/‘ && *(t+1) == ‘>‘)
{
if(node_stack.size() == 0 && *(t + 2) != ‘\0‘)
return false;
if(node_stack.size() == 0)
{
root = new XML_NODE(p + 1, q - p - 1, 0, s, t, 0);
last_node = root;
return true;
}else
{
last_node = new XML_NODE(p + 1, q - p - 1, 0, s, t - 1, 0);
(*(node_stack.end() - 1))->child_list.push_back(last_node);
}
p = t + 2;
}else if(*t == ‘>‘)
{
if(node_stack.size() == 0)
{
root = new XML_NODE(p + 1, q - p - 1, 0, s, t, 1);
node_stack.push_back(root);
}else
{
(*(node_stack.end() - 1))->child_list.push_back(new XML_NODE(p + 1, q - p - 1, 0, s, t, 1));
node_stack.push_back( *((*(node_stack.end() - 1))->child_list.end() - 1) );
}
p = t + 1;
}else
{
return false;
}
}else if(*p == ‘<‘ && *(p + 1) == ‘/‘)//结束节点 </form>
{
q = p + 2;
while(*q != ‘\0‘ && *q != ‘ ‘ && ch_not_spec(*q))
++q;
if(q == p + 2)
return false;
if(*q != ‘>‘)
return false;
if(strncmp(p+2, (*(node_stack.end() - 1))->name, q - p - 2) != 0)
return false;
if(node_stack.size() > 1)
{
last_node = *(node_stack.end() - 1);
node_stack.erase((node_stack.end() - 1));
}
else
{
root = *(node_stack.end() - 1);
last_node = root;
if(*(q + 1) != ‘\0‘)
return false;
}
p = q + 1;
}else if(*p != ‘>‘ && *p != ‘/‘)//字符串节点
{
q = p;
while(*q != ‘\0‘ && ch_not_spec(*q))
++q;
(*(node_stack.end() - 1))->child_list.push_back(last_node = new XML_NODE(p, q - p, 1, p, p, 1));
p = q;
}else //非法节点
{
return false;
}
}
if(node_stack.size() > 1)
return false;
return true;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/wangxugangzy05/article/details/47188931
内容总结
以上是互联网集市为您收集整理的解析xml全部内容,希望文章能够帮你解决解析xml所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。