C++MFC实现XML格式化

该文章展示了如何使用C++实现XML代码的格式化,包括处理缩进、换行以及标签的打开与关闭。CFormat类包含了getLevelStr函数来生成缩进字符串,以及format方法用于格式化输入的XML字符串。
摘要由CSDN通过智能技术生成

头文件定义

#pragma once
#include <string>

#define TAB_SPACE "    "
#define NEW_LINE  "\r\n"

class CFormat
{
public:
	virtual int format(CString input, CString& output) = 0;
	virtual int importDemo(CString &input) = 0;
	std::string getLevelStr(int level);
};

enum OpenStatus { Open,Close };

getLevelStr函数

std::string CFormatJson::getLevelStr(int level)
{
	std::string levelStr = "";
	for (int i = 0; i < level; i++)
	{
		levelStr += TAB_SPACE;
	}
	return levelStr;
}

格式化代码实现

int CFormatXml::format(CString input, CString& output) {
    std::string result = "";
    std::string inputData;

    OpenStatus beforeIsOpen = Open;
    OpenStatus afterIsOpen = Open;

    int openCnt = 0;
    int closeCnt = 0;
    int level = 0;

    inputData = CT2A(input.GetString());

    for (std::string::size_type index = 0; index < inputData.size(); index++)
    {
        char c = inputData[index];

        if (level > 0 && '\r\n' == inputData[inputData.size() - 1])
        {
            result += getLevelStr(level);
        }

        switch (c)
        {
        case '<':
            // xml头时
            if (inputData[index + 1] == '?') {
                result = result + c;
                continue;
            }

            // 开<a>
            if (inputData[index + 1] != '/') {
                openCnt++;
                afterIsOpen = Open;
            }
            else {
                // 关 </a>
                afterIsOpen = Close;
            }

            // 前开,后关不换行,无缩进
            if (beforeIsOpen == Open && afterIsOpen == Close) {

            }
            else {
                // 去除后面空格
                result.erase(result.find_last_not_of(" ") + 1);

                // 第一行不缩进
                if (index > 0) {
                    // 换行
                    result += NEW_LINE;

                    level = openCnt - closeCnt - 1;
                    result += getLevelStr(level);
                }
            }

            result = result + c;

            // 保留状态放在最下面
            if (inputData[index + 1] != '/') {
   
            }
            else {
                // 关 </a>
                closeCnt++;
            }
            beforeIsOpen = afterIsOpen;
            break;
        case '>':
            // xml头时
            if (inputData[index - 1] == '?') {
                result = result + c;
                continue;
            }
            // 关<a/>
            if (inputData[index - 1] == '/') {
                closeCnt++;
                afterIsOpen = Close;
                beforeIsOpen = afterIsOpen;
            }

            result = result + c;
            break;
        default:
            // 回车键
            if (c == '\r' || c == '\n') {
            }
            else {
                result += c;
            }
            break;
        }

    }

    // 输出
    output = result.c_str();
    return 1;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值