linux环境对xml的影响,Linux下XPath对xml解析

#ifndef CONF_XML_H

#define CONF_XML_H

// xml文件Z在《Linux下获取xml调试信息等级》里有

#include

#include

#include

#include

#include

#include

#include

#include

#define ROOT "root" //根节点

#define SON_1 "can0" //儿子节点1

#define SON_2 "can1" //儿子节点2

#define GRAND_SON "tag" //孙子节点

#define GRAND_SON_ATTR "id"

#define GREAT_GRANDSON_1 "attr" //曾孙节点1

#define GREAT_GRANDSON_2 "goods" //曾孙节点2

#define ID_STR_LEN 16

#define NAME_STR_LEN 32

#define TEL_STR_LEN 16

#define ADDR_STR_LEN 128

// xml结点结构体

typedef struct can_t

{

int id; // 编号

char attr[NAME_STR_LEN]; //

char goods[TEL_STR_LEN]; //

} can;

int ConfAddNode(char *son, int id, char *attr, char *goods);

int ConfDelNode(char *son, int id);

xmlXPathObjectPtr ConfGetNode(xmlDocPtr doc, xmlChar *xpath);

#endif

#include "conf_xml.h"

#include "conf_debug.h"

static int find_sub_node(xmlNodePtr root, char *son, int id, char *attr, char *goods)

{

xmlNodePtr cur = NULL, cur_grandson = NULL;

char cur_id[ID_STR_LEN] = {0};

snprintf(cur_id, ID_STR_LEN, "%d", id);

cur = root->xmlChildrenNode;

while(cur != NULL)

{

if ((!xmlStrcmp(cur->name, (const xmlChar *)son)))

{

cur_grandson = cur->xmlChildrenNode;

while(cur_grandson != NULL)

{

if ((!xmlStrcmp((const xmlChar *)cur_id, (const xmlChar *)xmlGetProp(cur_grandson, (const xmlChar*)GRAND_SON_ATTR))))

{

return 1;

}

cur_grandson = cur_grandson->next;

}

}

cur = cur->next;

}

return -1;

}

static int add_sub_node(xmlNodePtr root, char *son, int id, char *attr, char *goods)

{

xmlNodePtr cur;

char cur_id[ID_STR_LEN] = {0};

cur = root->xmlChirdrenNode;

while(cur != NULL);

{

if ((!xmlStrcmp(cur->name, (const xmlChar *)son)))

{

xmlNodePtr grandson = xmlNewNode(NULL, (const xmlChar *)GRAND_SON);

snprintf(cur_id, ID_STR_LEN, "%d", id);

xmlNewProp(grandson, (const xmlChar *)GRAND_SON_ATTR, (xmlChar*)cur_id);

xmlNewChild(grandson, NULL, (const xmlChar *)GREAT_GRANDSON_1, (xmlChar *)attr);

xmlNewChild(grandson, NULL, (const xmlChar *)GREAT_GRANDSON_2, (xmlChar *)goods);

xmlAddChild(cur, grandson);

}

cur = cur->next;

}

return 0;

}

static int del_sub_node(xmlNodePtr root_node, char *son, int id)

{

xmlNodePtr cur = NULL;

xmlNodePtr cur_grandson = NULL;

xmlNodePtr tempNode = NULL;

char cur_id[ID_STR_LEN] = {0};

snprintf(cur_id, ID_STR_LEN, "%d", id);

cur = root_node->xmlChildrenNode;

while(cur != NULL)

{

if ((!xmlStrcmp(cur->name, (const xmlChar *)son)))

{

cur_grandson = cur->xmlChildrenNode;

while(cur_grandson != NULL)

{

if ((!xmlStrcmp((const xmlChar *)cur_id, (const xmlChar *)xmlGetProp(cur_grandson, (const xmlChar*)GRAND_SON_ATTR))))

{

tempNode = cur_grandson->next;

xmlUnlinkNode(cur_grandson);

xmlFreeNode(cur_grandson);

cur_grandson = tempNode;

continue;

}

cur_grandson = cur_grandson->next;

}

}

cur = cur->next;

}

return 0;

}

int ConfAddNode(char * son, int id, char * attr, char * goods)

{

assert(CONF_FILE_NAME);

xmlDocPtr doc = NULL;

xmlNodePtr root = NULL;

doc = xmlReadFile(CONF_FILE_NAME, "UTF-8", 256); //解析文件

if (doc == NULL)

{

fprintf(stderr, "Failed to parser xml file:%s\n", CONF_FILE_NAME);

return -1;

}

root = xmlDocGetRootElement(doc);

if (root == NULL)

{

fprintf(stderr, "Failed to get root node.\n");

goto FAILED;

}

/*先查找有没有在同一个端口上有同一个id号的出现,如果有,就不要加入了,因为原来就有这个ID*/

if (find_sub_node(root, son, id, attr, goods) == 1)

{

xmlSaveFormatFileEnc(CONF_FILE_NAME, doc, "UTF-8", 1);

xmlFreeDoc(doc);

return 0;

}

if (add_sub_node(root, son, id, attr, goods) != 0)

{

fprintf(stderr, "Failed to add a new can node.\n");

goto FAILED;

}

//将文档保存到文件中,按照utf-8编码格式保存

xmlSaveFormatFileEnc(CONF_FILE_NAME, doc, "UTF-8", 1);

xmlFreeDoc(doc);

return 1;

FAILED:

if (doc)

{

xmlFreeDoc(doc);

}

return -1;

}

int ConfDelNode(char * son, int id)

{

assert(CONF_FILE_NAME);

xmlDocPtr doc = NULL;

xmlNodePtr root = NULL;

doc = xmlReadFile(CONF_FILE_NAME, "UTF-8", 256); //解析文件

if (doc == NULL)

{

fprintf(stderr, "Failed to parser xml file:%s\n", CONF_FILE_NAME);

return -1;

}

root = xmlDocGetRootElement(doc);

if (root == NULL)

{

fprintf(stderr, "Failed to get root node.\n");

goto FAILED;

}

if (del_sub_node(root, son, id) != 0)

{

fprintf(stderr, "Failed to add a new can node.\n");

goto FAILED;

}

//将文档保存到文件中,按照utf-8编码格式保存

xmlSaveFormatFileEnc(CONF_FILE_NAME, doc, "UTF-8", 1);

xmlFreeDoc(doc);

return 0;

FAILED:

if (doc)

{

xmlFreeDoc(doc);

}

return -1;

}

xmlXPathObjectPtr ConfGetNode(xmlDocPtr doc, xmlChar * xpath)

{

xmlXPathContextPtr context;

xmlXPathObjectPtr result;

context = xmlXPathNewContext(doc);

if (context == NULL)

{

printf("context is NULL\n");

return NULL;

}

result = xmlXPathEvalExpression(xpath, context);

xmlXPathFreeContext(context);

if (result == NULL)

{

printf("xmlXPathEvalExpression return NULL\n");

return NULL;

}

if (xmlXPathNodeSetIsEmpty(result->nodesetval))

{

xmlXPathFreeObject(result);

printf("nodeset is empty\n");

return NULL;

}

return result;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统下压缩文件,Linux系统下文件的压缩.打包与解压

处理 .zip 文件的 zip 和 unzipzip 和 unzip 程序位于 /usr/bin 目录中,它们和 MS - DOS 下的 pkzip、pkunzip 以及 MS-windows 的 Winzip 软件功能一样、可将文件压缩成 .zip 文件以节省硬盘空间,而当需要的时候再将压缩文件解开。压缩文件的 zip 命令z…

c语言程序执行完main函数后,一个c程序在执行main函数之前和main之后都做了那些事情啊该如何解决...

当前位置:我的异常网 C语言 一个c程序在执行main函数之前和main之后都做了那些一个c程序在执行main函数之前和main之后都做了那些事情啊该如何解决www.myexceptions.net 网友分享于:2013-04-17 浏览:19次一个c程序在执行main函数之前和main之后都做了…

c语言stm32串口控制单片机,实用STM32的串口控制平台的实现

假设我要编写一个自己的指令脚本, 来读取MCU的关键信息,关键字为mcu, 文件命名为shell_mcu.c; 当输入“mcu rd 0”时显示MCU的FLASH大小,输入“mcu rd 1”时读取MCU的唯一ID信息。shell_mcu.c源代码:/*****…

time_t c语言 2038,什么是2038问题?

什么是2038问题不知道你有没有听过2038问题?无论你是否听过,本文将带你认识什么是2038问题。Unix时间戳定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。而在C语言中,常用time_t来表示。举个例子…

C语言精度控制整形,C语言 凑算式 控制精度问题

想问一下,if语句中为什么写上*1.0之后,输出的就是对的个数29,但把*1.0删掉后,输出的个数就远大于29了?还想讨教一下各位高手,除了这种暴力求法,还有其他的比较好的方法吗?非常感谢/*…

c语言 l l next,nexttowardl

在头文件中定义float nextafterf( float from, float to );(1)(since C99)double nextafter( double from, double to );(2)(since C99)long double nextafterl( long double from, long double to );(3)(since C99)float nexttowardf( float from, long doub…

c 语言 readline,如何用C实现一个readLine()函数- 该函数每次读入文本文件的一行并打印到屏幕...

如何用C实现一个readLine()函数- 该函数每次读入文本文件的一行并打印到屏幕(2012-04-13 00:23:41)标签:打印文本文件如何杂谈如何用C实现一个readLine()函数? 该函数每次读入文本文件的一行并打印到屏幕以前看到过这方面的讨论http://bbs.chinaunix.net/viewthrea…

STC单片机C语言中的数据类型,stc单片机c语言程序设计 第9章 stc单片机c语言数据类型.pdf...

STC单片 机C语言变量和数据类型主讲:何宾Email :hebinmail.buct.edu.cn2016.03C语言中的常量和变量对于基本数据类型,按其值是否可变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量…

c4droid语言游戏,c4droid手机编程软件下载

c4droid可以说是手机端最好的编程软件,没有之一,软件可以帮助大家在手机上进行编写C代码,让各位程序员们随时随地都能编程。操纵简单,功能强大。c4droid软件介绍c4droid是款Android设备上的C/C程序编译器,默认以tcc(tiny c compil…

c语言图像函数怎么用,请教 怎么才能用C输出一个函数的图像?大侠 帮帮忙啊...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼发一下我当年的练习程序#include#include#include#includedouble exp(double x){double l,m;unsigned int n;l1; m1; n0;do {n;mx*m/n;llm; }while ((-1.0E-6<m)&&(m<1.0E-6));return l; }main(){int graphmode, gra…

创业冲突的五种解决方法是_不会说话,不懂处理人际冲突怎么办?《沟通的艺术》5步教会你...

关注“夏娃蓝空间”&#xff0c;陪你成长为更好的自己。想要良好地解决冲突&#xff0c;一定要有“这是我们两个人共同的事”的态度。今年夏天最热门的电视剧非《三十而已》莫属了&#xff0c;而撑起了这部剧的流量的广大观众&#xff0c;基本都是集中在逐步靠近中青年阶段的90…

android gsensor 坐标,MTK Android G sensor 原理,配置,调试

原理图&#xff1a;g_sensor的驱动目录在mediatek/custom/common/kernel/accelerometer下。一、g_sensor 的移植步骤1、在ProjectConfig.mk中配置相关的g_sensor例如 CUSTOM_KERNEL_ACCELEROMETER kxtf92、在mediatek/custom/common/kernel/accelerometer目录中添加 g_sensor的…

网贷大数据什么时候会好_如果人类把地球钻穿了,会发生什么?大数据分析告诉你多可怕...

很多科研人员在做实验的时候&#xff0c;少不了被旁人嘲笑或者蔑视的情况&#xff0c;因为常人往往是无法理解他们的想法的。例如曾经就有科研人员想要对地球进行钻探&#xff0c;看看能够在地表上钻多深&#xff0c;是否能够将地球给钻穿了。很多人都会认为这种做法没有意义而…

android h5 有广告,那些H5在Android上显示的丧心病狂的坑

首先得强调一下&#xff0c;H5和移动设备的交互遇到的问题真的是各种丧心病狂&#xff01;&#xff01;但是本主依然还是耐着极大的兴致(无奈)的做了下去。H5页面在Android或者IOS上运行出现问题(这里的运行指的是h5的页面运行在App里的webview里)&#xff0c;测试人员或者上级…

python非贪婪匹配_Python中关于正则表达式非贪婪以及多行匹配功能详解

这篇文章主要介绍了Python正则表达式非贪婪、多行匹配功能,结合实例形式分析了Python正则表达式中非贪婪及多行匹配功能的实现方法与相关注意事项,需要的朋友可以参考下本文实例讲述了Python正则表达式非贪婪、多行匹配功能。分享给大家供大家参考&#xff0c;具体如下&#xf…

小米9android q测试版,基于Android Q的MIUI来了 小米9尝鲜

01基于Android Q的MIUI来了中关村在线消息&#xff1a;谷歌在今年五月份发布了最新的Android Q系统&#xff0c;虽然很多国产手机还没有升级到Android P&#xff0c;但是还是有不少厂家开始对旗下的手机升级到最新的Android Q系统&#xff0c;根据小米最新的官方的消息&#xf…

ios传值给js_WKWebView JS与OC间相互传值调用

写在前面本文将介绍如何使用WKWebView进行JS与OC、OC与JS间的传值和方法调用。前置条件1、导入WebKit.framework2、声明WKWebViewJS调用OC原生方法1、前端在js文件中实现这里要注意messageHandlers后面跟着的deviceInfo要与原生的定义的一致。2、iOS 实现WKScriptMessageHandle…

android layerlist bitmap,android shape类似的 另一个 高端用法:layer-list

android shape类似的 另一个 高端用法&#xff1a;layer-list&#xff1a;简介&#xff1a;将多个图片或上面两种效果按照顺序层叠起来” 《?xml version"1.0" encoding"utf-8"?>《layer-listxmlns:android"http://schemas.android.com/apk/res/…

跨域会报40几_总结一下跨域的几种情况

在网站开发中&#xff0c;经常会遇到跨域问题&#xff0c;下面总结一下集中常见的跨域问题。1. 不同域名属于跨域&#xff0c;如&#xff1a;www.a.com 和www.b.com&#xff0c;另外www.a.com 和www.a.com.cn也属于不同域名。2. 主域名和子域名(二级域名、三级域名等)跨域&…

android将拍摄的图片存入sd卡中,Android将图片保存至SD卡上

首先判断SD卡是否插入-->public String getSDPath(){File SDdirnull;boolean sdCardExistEnvironment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);if(sdCardExist){SDdirEnvironment.getExternalStorageDirectory();}if(SDdir!null){return S…