今天在工作中遇到了一个需要处理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格式文件的更多相关文章

  1. java socket报文通信(三)java对象和xml格式文件的相互转换

    前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...

  2. Servlet 实现上传文件以及同时,写入xml格式文件和上传

    package com.isoftstone.eply.servlet; import java.io.BufferedReader; import java.io.BufferedWriter; i ...

  3. 使用visual studio把xsd文件转成xml格式文件

    使用visual studio把xsd文件转成xml格式文件 最近一段时间都在做Amazon的mws api的对接工作,mws api的描述文件都是使用的xsd文件来进行的,之前确实也没有接触过,也花 ...

  4. 简单创建json格式文件

    简单创建json格式文件 核心就两点: addProperty 添加属性(也就是加键值对) add是添加 另外的object对象 然后直接toString()输出 核心代码如下; public cla ...

  5. Opencv YAML和XML格式文件操作详解

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/47660943 本文参考Opencv 2 ...

  6. WP8解析XML格式文件

    DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式,如果要返回XML格式的话,需要在加上format=xml. 这里举一个简单的解析XML格式的例子(更 ...

  7. dom4解析xml格式文件实例

    以下给4种常见的xml文件的解析方式的分析对比: DOM DOM4J JDOM SAX 解析XML文件的几种方式和区别答: Dom解析 在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工 ...

  8. python利用lxml读写xml格式文件

    之前在转换数据集格式的时候需要将json转换到xml文件,用lxml包进行操作非常方便. 1. 写xml文件 a) 用etree和objectify from lxml import etree, o ...

  9. java使用jdom生成xml格式文件

    本文生成xml使用的工具是jdom.jar,下载地址如下: 链接:https://eyun.baidu.com/s/3slyHgnj 密码:0TXF 生成之后的文档格式类型,就如上面的图片一样,简单吧 ...

随机推荐

  1. STS 重写父类方法的操作

    本来这种东西真的没什么好写的,但是很多时候真的是要用到的,不知道的话自己手动敲,会累死人的.所以记录在这里,自己的笔记,有需要的赶紧拿去,省的手动录入那么辛苦. 在代码窗口点击右键,依次选择“Sour ...

  2. IDEA帮助文档快捷键ctrl+q 查看类 方法 变量 帮助文档 注释 快捷键

    IDEA查看类 成员变量  局部变量注释快捷键,Ctrl +Q 查看帮助文档 实际项目中,通常一个类中的代码都不少,而且有很多的变量 那么如何快速知道这个变量的一些信息,比如类型,定义? 比如在第50 ...

  3. error: open(".vs/ConsoleApp349/v16/Server/sqlite3/db.lock"): Permission denied error: unable to index file

    第一种1.git add --ignore-errors . 特别注意 git add --ignore-errors . errors后面有一个空格再加一个点' .' 第二种: 1.touch .g ...

  4. 安装Yapi时,出现json-schema-faker模块找不到问题

    今天换了一台机器按以前的方式安装Yapi工具时,竟然出现了错误. 一 安装yapi时,出现了下面的报错,一开始以为没安装json-schema-faker模块.后面通过找资料,发现是权限问题, 使用c ...

  5. Flask--g属性

    目录 Flask之g属性 使用 session,flash,g的区别 Flask之g属性 专门用来存储用户信息的g对象,g的全称的为global g对象在一次请求中的所有的代码的地方,都是可以使用的 ...

  6. 深入理解JVM虚拟机(一):JVM运行时数据区

    概述: JVM将内存的管理进行封装,使得开发人员不必关心内存申请.释放操作.但是在高级程序开发.复杂业务场景开发的时候,如果出现内存溢出的情况,对于开发人员而言就很难去分析出原因.所以还是很有必要去了 ...

  7. Fundebug后端Node.js插件更新至0.2.0,支持监控Express慢请求

    摘要: 性能问题也是BUG,也需要监控. Fundebug后端Node.js异常监控服务 Fundebug是专业的应用异常监控平台,我们Node.js插件fundebug-nodejs可以提供全方位的 ...

  8. Spark应用程序开发流程

    配置文件: pom.xml <properties> <scala.version>2.11.8</scala.version> <spark.version ...

  9. 基于Docker实现MySQL主从复制

    前言 MySQL的主从复制是实现应用的高性能,高可用的基础.对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同MySQL服务器,可有效减轻数据库压力.当遇到MySQL单点故障中,也能在短 ...

  10. 困扰了2天的问题,终于解决了。VB6的MSComCtl.ocx在32位Win7显示对象库未注册

    解决方案在这里,中文的资料真的挺垃圾的.(重启几次之后又不行了....怎么回事???) 安装.net framework4.0以上版本, C:\Windows\System32, C:\Windows ...