今天在工作中遇到了一个需要处理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. pixijs shader 扫光加强版

    pixijs shader 扫光加强版 const app = new PIXI.Application({ transparent: true }); document.body.appendChi ...

  2. php json_decode无法处理\解决方法

    php json_decode无法处理\解决方法 <pre>$aa=urlencode('eee\ee');$dfda='[{"company":"测试&qu ...

  3. python3爬虫筛选所需要数据

    第一次使用博客园,也是第一篇文章,让我们一起开启学习之旅吧!! 昨天在为某授权系统做安全性测试的时候,可以未授权访问系统的用户登陆统计记录.由此想整理出部分用户名,作为暴力破解的用户名,检查是否存在用 ...

  4. 单个视频播放控制&默认横屏播放

    一.视频列表中控制只允许一个视频播放 // 获取DOM中所有的video标签 var videoTags = document.querySelectorAll('video'); // 控制播放的视 ...

  5. 如何给gridControl动态的添加合计

    for (int i = 0; i < this.dsHz.Tables[0].Columns.Count; i++) { if (dsHz.Tables[0].Columns[i].DataT ...

  6. 在 .NET Core 中使用异步的 ADO.NET 的简单示例

    直接贴代码: Program.cs using Microsoft.Extensions.Configuration; using System; using System.Data; using S ...

  7. 『Exclusive Access 2 dilworth定理 状压dp』

    Exclusive Access 2 Description 给出 N 个点M 条边的无向图,定向得到有向无环图,使得最长路最短. N ≤ 15, M ≤ 100 Input Format 第一行一个 ...

  8. duba网址对firefox快捷方式的劫持

    直接删除 “驱动精灵” 即可. 等我 二进制安全 学好了,一定开发一种病毒专干这种劫持的,煞笔软件.

  9. SQL Server中使用SQL语句关闭数据库连接和删除数据库文件

    有时候我们想用DROP DATABASE语句删除数据库和数据库文件,会删不掉,因为有其他人正在使用要删除的数据库,这里有一个方法可以强制断开其它数据库连接,再删除数据库. 假如我们要删除的数据库是[T ...

  10. C# .NET 使用 NPOI 读取 .xlsx 格式 Excel

    string filePath = @"C:\Users\yangqinglin\Desktop\test.xlsx"; IWorkbook wk = null; string e ...