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 = -1;
    if (pTmpXml == NULL || pValue == NULL || pKey == NULL)
    {
        return iRet;
    }

    memset(pValue, 0, sizeof(pValue));
    char BegKey[64] = {0};
    char EndKey[64] = {0};
    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 + 1,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 = 0;
    }
    else
    {
        iRet = -2;
    }

    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 = -1;
    if (pStrXml == NULL || pStuXml == NULL)
    {
        return iRet;  //
    }

    char szInbuf[1024] = {0};
    int nInbufSize = 0;
    nInbufSize += sprintf(szInbuf, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

    char key[64] = {0};
    char value[64] = {0};
    char *pTmpXml = pStrXml;

    char KeyXml[][64] = {"id", "maxFrameRate", "reflectiveEnable", "reflectiveTemperature",
                          "emissivity", "distance", "refreshInterval", "distanceUnit",
                           "temperatureDataLength", "jpegPicEnabled"};
    int len_KeyXml = sizeof(KeyXml) / sizeof(KeyXml[0]);
    printf("len_KeyXml = %d\n", len_KeyXml);
    for (int i = 0 ; 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 0;
}

int main()
{
    int iRet = -1;
    char Outxml[1024] = " <?xml version=\"1.0\" encoding=\"UTF-8\"?> \n\
<PixelToPixelParam version=\"2.0\" xmlns=\"http://www.hikvision.com/ver20/XMLSchema\"> \n\
<id>2</id>  \n<maxFrameRate>400</maxFrameRate>    \n<reflectiveEnable>false</reflectiveEnable>  \n<reflectiveTemperature>20.00</reflectiveTemperature>\n<emissivity>0.96</emissivity>\n<distance>3000</distance>\n<refreshInterval>50</refreshInterval>\n<distanceUnit>centimeter</distanceUnit>\n<temperatureDataLength>4</temperatureDataLength>\n<JpegPictureWithAppendData>\n<jpegPicEnabled>true</jpegPicEnabled>\n</JpegPictureWithAppendData>\n</PixelToPixelParam>";

    char Inxml[1024] = {0};

    float fEmissvity = 0.01;
    int wDistance = 10;
    //iRet = HandleXml(Outxml, &stuXml);

    char szInbuf[1024] = {0};
    int nInbufSize = 0;
    nInbufSize += sprintf(szInbuf, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

    char key[64] = {0};
    char value[64] = {0};
    char *pTmpXml = Outxml;

    char KeyXml[][64] = {"id", "maxFrameRate", "reflectiveEnable", "reflectiveTemperature",
                          "emissivity", "distance", "refreshInterval", "distanceUnit",
                           "temperatureDataLength", "jpegPicEnabled"};
    int len_KeyXml = sizeof(KeyXml) / sizeof(KeyXml[0]);
    printf("len_KeyXml = %d\n", len_KeyXml);
    for (int i = 0 ; 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 ( 0 == (strcmp(key, "emissivity")))
            {
                nInbufSize += sprintf(szInbuf+nInbufSize, "\n<%s>%.2f</%s>", key, fEmissvity, key);
            }
            else if ( 0 == (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 0;
}

如果是都xml文件的话只需要加上读写文件操作就可以使用了。

这个是非常简单的xml文件解析

其实还需要一个错误控制,对于遇到的每一个错误都有相应的返回码,在读取文件错误的时候可以准确的定位到错误在哪里发生的。

原文地址:https://www.cnblogs.com/wanghao-boke/p/12030691.html

时间: 2024-10-05 22:34:55

C实现简单的xml格式文件的相关文章

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

前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每次都去写字符串啊,这样的话肯定要疯.既然是面向对象的编程,肯定会有好的办法来解决这个问题.我们使用JAXBContext这个工具. package cn.com.egj.entity.shortcutTransfer.test; import java.io.BufferedReader; impo

读取xml格式文件

$v = [xml]get-content d:\vmconfig.xml $v.Domain.Computer.Name vmconfig.xml内容: <?xml version="1.0" encoding="UTF-8"?><Domain><Computer><Name>stcmm-vm-s01</Name><IpAddress>192.168.0.2</IpAddress>

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

package com.isoftstone.eply.servlet; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io

使用第三方DOM解析XML格式文件

在解析XML格式文件的时候,使用SAX解析需要实现好多代理方法,比较难记,也容易出错,现在介绍一种由Google推出的第三方DOM(Document Object Model)来解析XML文件. 首先将该第三方文件拖到工程中.谷歌下载地址:https://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/ (注:由于该三方是很久之前的版本,还是基于MRC格式下的代码,所以需要改成ARC兼

简单创建json格式文件

简单创建json格式文件 核心就两点: addProperty 添加属性(也就是加键值对) add是添加 另外的object对象 然后直接toString()输出 核心代码如下; public class CreateJson { public static void main(String[] args) { JsonObject object= new JsonObject(); object.addProperty("cat", "it"); JsonArra

通过java代码生成XML格式文件

import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import javax.swing.JOptionPane; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; /** * 本类测试生成XML格式的文件 * @author guanshun * */

oracle导出结果集为xml格式文件

一.从oracle到xml 1.  启动sqlplus执行> (1)获取导出表的所有字段: 替换语句中TABLE_NAME,OWNER为需要导出的表名及表的用户名,修改语句后在sqlplus中执行(执行用户需要有dba权限) SELECT replace(wm_concat(cols),',','||') FROM ( SELECT ''''|| '<'||COLUMN_NAME||'>'||''''||'||'||column_name||'||'||''''||'<'||col

python:将xml格式文件转换成json格式文件

由于json格式的文件在处理起来,有很强的便利性,而工作中每天产生大量的xml格式的文件,所以有需求将xml格式的文件转换成json格式的文件.下面直接贴出代码,有两个版本,根据需求自由选择: #!/usr/bin/python # -*- coding: utf-8 -*- #Function:Xml_To_Json #version 1.0 #Author: Herman #需要用到的两个模块 import xmltodict; import json; #定义函数 def pythonXm

dom4解析xml格式文件实例

最近,一哥们在他们公司搞大数据时遇到一份比较棘手的xml文件,需要进行巧妙合理的解析,然后将数据进行封装和保存,由于文件比较大,数据比较多,格式稍微复杂一点,所以我帮他解决,刚拿到文件也觉得无从下手,因为文件中的数据格式确实有点复杂.以下给4种常见的xml文件的解析方式的分析对比: DOM DOM4J JDOM SAX 解析XML文件的几种方式和区别答: Dom解析 在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的,