今天在工作中遇到了一个需要处理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. 我是如何理解并使用maven的

    前言 一直想写一篇关于Maven的文章,但是不知如何下笔,如果说能使用,会使用Maven的话,一.两个小时足矣,不需要搞懂各种概念.那么给大家来分享下我是如何理解并使用maven的. 什么是Maven ...

  2. svg描边路径动画

    svg描边路径动画<pre><!DOCTYPE html><html> <head> <meta charset="UTF-8" ...

  3. 《Spring + MyBatis 企业应用实战》书评

    最近公司的前端用 MpVUE.JS 开发微信小程序遇到一个问题,对后端传来的富文本编辑器的标签无法进行解析.因为公司小,这个问题前端人员直接反映给老板,跟老板说,“ MpVUE.JS 无法解析富文本编 ...

  4. MySQL 数据库中删除重复数据的方法

    演示数据,仅供参考 查询表结构: mysql> desc test; +-------+------------------+------+-----+---------+----------- ...

  5. Vue devtool插件安装后无法使用,提示“vue.js not detected”的解决方法

    vue devtool下载 极简插件  github vue devtool安装 点击谷歌浏览器箭头所指图标-更多工具-扩展程序   ①:直接将后缀为crx的安装包拖进下图区域即可自动安装     ② ...

  6. sql语句规范参考

    公司有SQL语句规范的参考,这里特别做个笔记. 书写风格 1. 语句关键字应全部使用小写. 2. 引用字符时应使用单引号.如:update testable set idcol=’abcd’. 3. ...

  7. Vue基础框架

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- 设置语言为 ...

  8. LinuxShell——内嵌命令

    LinuxShell——内嵌命令 摘要:本文主要学习了Shell的常用内嵌命令. alias命令 alias命令可以为指定命令定义一个别名. 基本语法 查看所有别名: alias 设置别名: alia ...

  9. 查看java程序的指令码

    java程序转化为JVM指令码分析 1.编写java文件(简易示例) /** * @author yew * @date on 2019/12/9 - 15:53 */ public class Ma ...

  10. C#中将long浮点数格式化为{H:min:s.ms}格式的字符串的方法

    场景 表示时间的数据格式为浮点数,如下: 需要将其格式化为{H:min:s.ms}格式的字符串,效果如下: 注: 博客主页:https://blog.csdn.net/badao_liumang_qi ...