C实现简单的xml格式文件
今天在工作中遇到了一个需要处理xml格式的字符串,需求是修改某个固定的value值,并且还要把这个xml的key和value按照原本的格式在推送回去。
如果使用库,就显得太臃肿了,就想写个简单的demo实现这个功能:
/*
AnalysisXml.c
*/
#include<stdio.h>
#include<string.h> /* function: find the corresponding value with the key transmitted
* parameter :
* [in/out] pTmpXml the afferent string of xml that remaining after finding
* [int]pKey the key of incoming
* [out]pValue find the corresponding value
* returned value:
* -1 : pStrXml or pStuXml is null
* -2 : the corresponding value is null or the key is not find
*/
static int AnalysisXml(char *pTmpXml, char *pValue, char *pKey)
{
int iRet = -;
if (pTmpXml == NULL || pValue == NULL || pKey == NULL)
{
return iRet;
} memset(pValue, , sizeof(pValue));
char BegKey[] = {};
char EndKey[] = {};
sprintf(BegKey, "<%s>", pKey);
sprintf(EndKey, "</%s>", pKey); //printf("BegKey = %s\n", BegKey);
//printf("EndKey = %s\n", EndKey); char *pBegin = pTmpXml;
char *pEnd = NULL; int BegKey_len = strlen(BegKey); if ( (pBegin = strstr(pTmpXml, BegKey)) != NULL)
{ pEnd = strstr(pBegin + ,EndKey );
memcpy(pValue, pBegin + BegKey_len, pEnd - pBegin - BegKey_len);
//printf("%s = %s\n", BegKey, pValue);
pTmpXml = pEnd + strlen(EndKey);
//printf("pTmpXml = %s\n",pTmpXml);
iRet = ;
}
else
{
iRet = -;
} return iRet; } /* function: analysis string whose foramt is xml
* parameter :
* [in] pStrXml the afferent string of xml
* [out]pStuXml the struct of saving value of various
* returned value:
* -1 : pStrXml or pStuXml is null
*/
int HandleXml(char *pStrXml, XML_CONFIG_INPUT *pStuXml)
{
int iRet = -;
if (pStrXml == NULL || pStuXml == NULL)
{
return iRet; //
} char szInbuf[] = {};
int nInbufSize = ;
nInbufSize += sprintf(szInbuf, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); char key[] = {};
char value[] = {};
char *pTmpXml = pStrXml; char KeyXml[][] = {"id", "maxFrameRate", "reflectiveEnable", "reflectiveTemperature",
"emissivity", "distance", "refreshInterval", "distanceUnit",
"temperatureDataLength", "jpegPicEnabled"};
int len_KeyXml = sizeof(KeyXml) / sizeof(KeyXml[]);
printf("len_KeyXml = %d\n", len_KeyXml);
for (int i = ; i < len_KeyXml; i++)
{
//printf("KeyXml[%d] = %s\n", i, KeyXml[i]);
sprintf(key, "%s", KeyXml[i]);
iRet = AnalysisXml(pTmpXml, value, key); if (value != NULL)
{
printf("%s = %s\n", key, value);
bool flag = (strcmp(key, "jpegPicEnabled"));
if(!flag)
{
nInbufSize += sprintf(szInbuf+nInbufSize, "\n<JpegPictureWithAppendData>");
}
nInbufSize += sprintf(szInbuf+nInbufSize, "\n<%s>%s</%s>", key, value, key);
if(!flag)
{
nInbufSize += sprintf(szInbuf+nInbufSize, "\n</JpegPictureWithAppendData>");
}
}
else
{
printf("value is null\n");
}
} printf("\nszInbuf = %s \n",szInbuf);
return ;
} int main()
{
int iRet = -;
char Outxml[] = " <?xml version=\"1.0\" encoding=\"UTF-8\"?> \n\
<PixelToPixelParam version=\"2.0\" xmlns=\"http://www.hikvision.com/ver20/XMLSchema\"> \n\
<id></id> \n\
<maxFrameRate></maxFrameRate> \n\
<reflectiveEnable>false</reflectiveEnable> \n\
<reflectiveTemperature>20.00</reflectiveTemperature>\n\
<emissivity>0.96</emissivity>\n\
<distance></distance>\n\
<refreshInterval></refreshInterval>\n\
<distanceUnit>centimeter</distanceUnit>\n\
<temperatureDataLength></temperatureDataLength>\n\
<JpegPictureWithAppendData>\n\
<jpegPicEnabled>true</jpegPicEnabled>\n\
</JpegPictureWithAppendData>\n\
</PixelToPixelParam>"; char Inxml[] = {}; float fEmissvity = 0.01;
int wDistance = ;
//iRet = HandleXml(Outxml, &stuXml); char szInbuf[] = {};
int nInbufSize = ;
nInbufSize += sprintf(szInbuf, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); char key[] = {};
char value[] = {};
char *pTmpXml = Outxml; char KeyXml[][] = {"id", "maxFrameRate", "reflectiveEnable", "reflectiveTemperature",
"emissivity", "distance", "refreshInterval", "distanceUnit",
"temperatureDataLength", "jpegPicEnabled"};
int len_KeyXml = sizeof(KeyXml) / sizeof(KeyXml[]);
printf("len_KeyXml = %d\n", len_KeyXml);
for (int i = ; i < len_KeyXml; i++)
{
//printf("KeyXml[%d] = %s\n", i, KeyXml[i]);
sprintf(key, "%s", KeyXml[i]);
iRet = AnalysisXml(pTmpXml, value, key); if (value != NULL)
{
printf("%s = %s\n", key, value);
bool flag = (strcmp(key, "jpegPicEnabled"));
if(!flag)
{
nInbufSize += sprintf(szInbuf+nInbufSize, "\n<JpegPictureWithAppendData>");
} if ( == (strcmp(key, "emissivity")))
{
nInbufSize += sprintf(szInbuf+nInbufSize, "\n<%s>%.2f</%s>", key, fEmissvity, key);
}
else if ( == (strcmp(key, "distance")))
{
nInbufSize += sprintf(szInbuf+nInbufSize, "\n<%s>%d</%s>", key, wDistance, key);
}
else
{
nInbufSize += sprintf(szInbuf+nInbufSize, "\n<%s>%s</%s>", key, value, key);
} if(!flag)
{
nInbufSize += sprintf(szInbuf+nInbufSize, "\n</JpegPictureWithAppendData>");
}
}
else
{
printf("value is null\n");
}
}
printf("\nszInbuf = %s \n",szInbuf);
return ;
}
如果是都xml文件的话只需要加上读写文件操作就可以使用了。
这个是非常简单的xml文件解析
其实还需要一个错误控制,对于遇到的每一个错误都有相应的返回码,在读取文件错误的时候可以准确的定位到错误在哪里发生的。
C实现简单的xml格式文件的更多相关文章
- java socket报文通信(三)java对象和xml格式文件的相互转换
前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...
- Servlet 实现上传文件以及同时,写入xml格式文件和上传
package com.isoftstone.eply.servlet; import java.io.BufferedReader; import java.io.BufferedWriter; i ...
- 使用visual studio把xsd文件转成xml格式文件
使用visual studio把xsd文件转成xml格式文件 最近一段时间都在做Amazon的mws api的对接工作,mws api的描述文件都是使用的xsd文件来进行的,之前确实也没有接触过,也花 ...
- 简单创建json格式文件
简单创建json格式文件 核心就两点: addProperty 添加属性(也就是加键值对) add是添加 另外的object对象 然后直接toString()输出 核心代码如下; public cla ...
- Opencv YAML和XML格式文件操作详解
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/47660943 本文参考Opencv 2 ...
- WP8解析XML格式文件
DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式,如果要返回XML格式的话,需要在加上format=xml. 这里举一个简单的解析XML格式的例子(更 ...
- dom4解析xml格式文件实例
以下给4种常见的xml文件的解析方式的分析对比: DOM DOM4J JDOM SAX 解析XML文件的几种方式和区别答: Dom解析 在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工 ...
- python利用lxml读写xml格式文件
之前在转换数据集格式的时候需要将json转换到xml文件,用lxml包进行操作非常方便. 1. 写xml文件 a) 用etree和objectify from lxml import etree, o ...
- java使用jdom生成xml格式文件
本文生成xml使用的工具是jdom.jar,下载地址如下: 链接:https://eyun.baidu.com/s/3slyHgnj 密码:0TXF 生成之后的文档格式类型,就如上面的图片一样,简单吧 ...
随机推荐
- Python 文件readlines()方法
原文连接:https://www.runoob.com/python/file-readlines.html readlines()方法用于读取所有行(直到结束符EOF)并返回列表,该列表可以由pyt ...
- docker安装和配置Grafana
目录 安装 docker 启动 配置 配置域名和端口 配置ldap 配置邮箱 添加数据源 创建dashboard 配置alert 安装 docker 启动 先普通启动,然后把配置文件导出来,修改配置文 ...
- 你必须知道的EF知识和经验(转)
注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...
- WPF 鼠标移动时触发图片旋转(非动画)
非动画,只是简单的触发器. 主要是针对旋转的写法. 代码 <Grid> <Image x:Name="image" Source="nifi3.gif& ...
- 何谓SQLSERVER参数嗅探(转载)
大家听到“嗅探”这个词应该会觉得跟黑客肯定有关系吧,使用工具嗅探一下参数,然后截获,脱裤o(∩_∩)o .事实上,我觉得大家太敏感了,其实这篇文章跟数据库安全没有什么关系,实际上跟数据库性能调优有关相 ...
- ASP.NET Core快速入门(第5章:认证与授权)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务31:课时介绍 1.Cookie-based认证与授权 2.Cookie- ...
- JVM指令手册
JVM指令大全 常量入栈指令 指令码 操作码(助记符) 操作数 描述(栈指操作数栈) 0x01 aconst_null null值入栈. 0x02 iconst_m1 -1(int)值入栈. 0x03 ...
- UML与设计模式
这个在大中华区不知道是否重视,反正我是接触的人中谈的少,除了想起大学有个博士级别的老师,给我们上课天天老拿着一本外文翻译的UML书外,可真要重视起来的. 加深一个单词,模式pattern,patter ...
- Vue计算属性computed的全面解析
前言 一直以来对computed这个计算属性都只停在一个大概的认知中,最近特意仔细研读相关资料,亲测后逐渐了解了其特性. 正文 computed 特点: 1.初始化/依赖属性(即data属性)改变时执 ...
- iOS开发之--隐藏状态栏
1,全局隐藏 在Targets->General->勾选中Hide status bar .,如下图: 2.单个页面隐藏/展示状态栏 1).首先在info.plist里面View cont ...