应要求需要删除xml文件中的空格,制表符等字符。要求双引号和xml的text属性中包含的空格不删除。

 bool delSpace(QFile &file, QString path)

 //删除file文件中的空格,双引号以及xml中text属性中的空格不删除。file为目标文件,path为新文件保存的路径及名称。
//操作成功true ,失败返回false
{
QByteArray qfile;
QTextStream in(&qfile);
char ch; //当前读入的一个字符
char tem;
qint64 position;//文件中存储当前读指针的临时变量 int ifg = ; //双引号的标记,值为1表示进入双引号范围;值为0表示不在双引号范围内
int ifgn = ; //找到xml中text属性的标记,值大于0表示找到text属性;值为0表示未找到text属性
int idel = ; //进入text属性的标记,值为1表示进入text属性范围;值为0表示不在text属性范围
int ibk = ; //退出外层循环标记 while(!file.atEnd())
{
file.read(&ch,); if((ifg == ) && (ifgn == ))
//当前不再双引号和text属性范围内
{
if(ch == '"')
{
ifg ++;
in << ch; }
else if((ch == ) || (ch == ) ||(ch == ) || (ch == ) || (ch == ))
{
continue;
}
else if(ch == '<')
{
in << ch;
position = file.pos(); //保存当前读指针,往后寻找text属性
while()
{
file.read(&tem, );
if(tem == '>')
{
ifgn ++;
while()
{
file.read(&tem, );
if(tem == '<')
{
ifgn ++;
file.read(&tem, );
if(tem == '/')
{
ifgn ++; //找到text属性,ifgn = 3
ibk = ; //退出外层循环
break;
}
else
{
ifgn = ; //未找到text属性,ifgn = 0
ibk = ; //退出外层循环
break;
}
}
else if(tem == '>') //寻找text属性失败
{
ifgn = ;
ibk = ;
break;
} }
if(ibk == )
{
file.seek(position);//退出寻找text属性,获取之前保存的读指针
break;
}
}
else if(tem == '/') //寻找text属性失败
{
ifgn = ;
file.seek(position);//退出寻找text属性,获取之前保存的读指针
break;
} }
}
else
{
in << ch;
} }
else if((ifg > ) && (ifgn == ))
//当前在双引号范围内,不再text属性范围内
{
if(ch == '"')
{
ifg--;
in << ch;
}
else if(ch == '<')
{
in << ch;
position = file.pos();
while()
{
file.read(&tem, );
if(tem == '>')
{
ifgn ++;
while()
{
file.read(&tem, );
if(tem == '<')
{
ifgn ++;
file.read(&tem, );
if(tem == '/')
{
ifgn ++; //找到text属性,ifgn = 3
ibk = ; //退出外层循环
break;
}
else
{
ibk = ; //未找到text属性,ifgn = 0
break; //退出外层循环
}
}
else if(tem == '>')
{
ifgn = ;
ibk = ;
break;
} }
if(ibk == )
{
file.seek(position);//退出寻找text属性,获取之前保存的读指针
break;
}
}
else if(tem == '/')
{
ifgn = ;
file.seek(position);//退出寻找text属性,获取之前保存的读指针
break;
} }
}
else
{
in << ch;
}
}
else if((ifg == ) && (ifgn > ))
//当前不在双引号范围内,在text属性范围内
{
if(idel == )
{
if(ch == '"')
{
ifg ++;
in << ch; }
else if((ch == ) || (ch == ) ||(ch == ) || (ch == ) || (ch == ))
{
continue;
}
else if(ch == '>')
{
in << ch;
idel++;
}
else
{
in << ch;
} }
else if(idel > )
{
if(ch == '<')
{
ifgn = ;
idel--;
in << ch; }
else if(ch == '"')
{
ifg ++;
in << ch; }
else
{
in << ch;
}
} }
else if((ifg > ) && (ifgn > ))
//当前在双引号和text属性范围内
{
if(idel == )
{
if(ch == '"')
{
ifg --;
in << ch; }
else if(ch == '>')
{
in << ch;
idel++;
}
else
{
in << ch;
} }
else if(idel > )
{
if(ch == '<')
{
ifgn = ;
idel--;
in << ch; }
else if(ch == '"')
{
ifg --;
in << ch; }
else
{
in << ch;
}
}
} } in.flush();
QFile file2(path);
if (file2.open(QFile::ReadWrite|QFile::Truncate))
{
file2.write(qfile);
}
else
{
return false;
}
file2.close();
return true;
}

删除XML文件中的空格的更多相关文章

  1. C# XML 文件中的空格值问题

    C# XML 文件中的空格值问题 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-15 近期正在写我的简易标记文件格式的程序, ...

  2. C#程序中:如何删除xml文件中的节点、元素。

    C#中动态的清理xml文件中的垃圾信息是程序员必会的哦.这就像数据库一样,不会清理数据怎么可以呢?其实xml文件就可以用作一个小的数据库,存储一些简单的信息.所以,用C#程序实现xml文件的增.删.改 ...

  3. 批量删除xml文件中的<?xml version="1.0" ?>

    #!/bin/shcd 'home/usrname/'ls cd '/home/usrname/VOC2007/Annotations/' for file in `ls /home/usrname/ ...

  4. WEB项目web.xml文件中classpath: 跟classpath*:使用的区别

    引用一篇很不错的文章:http://blog.csdn.net/wxwzy738/article/details/16983935 首先 classpath是指 WEB-INF文件夹下的classes ...

  5. web.xml文件中加载顺序的优先级

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  6. 获取微信签名,并保存在xml文件中

    using System; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using Sys ...

  7. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  8. 把xml格式的字符串写入到一个xml文件中

    package demo; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...

  9. Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写

    转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...

随机推荐

  1. 为什么你写的用例测不出Bug来?

    我们写测试用例的目的是为了能够整理思路,把要测试的地方列出来,做为知识的积淀,用例可以交给其他测试人员执行,或者是跟需求提出者进行讨论,对用例进行补充和修改.那么为啥你写的用例测不出Bug来呢,真的是 ...

  2. GitLab篇之备份还原

    1. GitLab备份配置 输入以下命令,打开gitlab配置文件 [root@code-server ~]# vim /etc/gitlab/gitlab.rb 修改以下配置,gitlab有自动清理 ...

  3. spring boot 配置全局日期类型转换器

    1. 首先自定义一个类型转换器 import org.springframework.core.convert.converter.Converter; import org.springframew ...

  4. 如何布局您的PC站和移动站,并表达两者之间内容的对应关系

      如何布局您的PC站和移动站,并表达两者之间内容的对应关系 目前较流量的PC站与移动站配置方式有三种,百度站在搜索引擎角度将这三种分别称为跳转适配.代码适配和自适应,以下为这三种配置方式的名词解释及 ...

  5. Python 3 利用机器学习模型 进行手写体数字检测

    0.引言 介绍了如何生成手写体数字的数据,提取特征,借助 sklearn 机器学习模型建模,进行识别手写体数字 1-9 模型的建立和测试. 用到的几种模型: 1. LR,Logistic Regres ...

  6. 记一次RMI的调用数据失误

    这两天在测试一个Spring RMI接口的时候,出现了个奇怪的问题.Server端返回的数据,到了客户端出现了属性丢失的情况. 类继承体系 .客户端里面定义在ClassA中的属性全部为null. 分析 ...

  7. Netty源码分析第5章(ByteBuf)---->第3节: 缓冲区分配器

    Netty源码分析第五章: ByteBuf 第三节: 缓冲区分配器 缓冲区分配器, 顾明思议就是分配缓冲区的工具, 在netty中, 缓冲区分配器的顶级抽象是接口ByteBufAllocator, 里 ...

  8. VMware vCenter Converter迁移Linux系统虚拟机

    (一)简介VMware vCenter Converter Standalone,是一种用于将虚拟机和物理机转换为 VMware 虚拟机的可扩展解决方案.此外,还可以在 vCenter Server ...

  9. 程序设计 之 C#实现《拼图游戏》 (上)代码篇

    原理详解请参考博客中 拼图游戏(下)原理篇 http://www.cnblogs.com/labixiaohei/p/6713761.html 功能描述: 1.用户自定义上传图片 2.游戏难度选择:简 ...

  10. spring-boot rabbitMq 完整项目搭建,包括创建、发送、监听

    写在开始 rabbitMq 代码按照三部分介绍 第一部分 交换机和队列的创建 第二部分 消息发送 第三部分 消息监听 第一部分 1 建立queue 2 建立exchange 3 exchange绑定q ...