应要求需要删除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. 理解unittest(六)

    unittest,顾名思义就是一个单元测试框架,但是它不仅适用于单元测试,还适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成 ...

  2. unity灯光烘焙设置详解

    游戏场景中灯光照明的构成 现实生活中的光线是有反射.折射.衍射等特性的.对这些基本特性的模拟一直以来都是计算机图形图像学的重要研究方向. 在CG中,默认的照明方式都是不考虑这些光线特性的,因此出来的效 ...

  3. redis-4.0.2

    redis-4.0.2.tar.gz 链接:https://pan.baidu.com/s/1qj4bSgM1s2InLikugRNqKA 提取码:tozq 复制这段内容后打开百度网盘手机App,操作 ...

  4. JDBC Mysql 驱动连接异常

    在做JDBC连接Mysql的时候遇到了三个异常: 第一个是:mysql8.0 caching_sha2_password 这个异常是由于是因为在mysql8.0之前的密码规则是mysql_native ...

  5. (转)CentOS7系统信息及运行情况查看

    原文链接:https://blog.csdn.net/qq_42196196/article/details/85063911 系统信息 CPU信息 内存信息 显卡信息 硬盘信息 网络信息 用户信息 ...

  6. 【Docker】第五篇 Docker 数据管理

    一.基本介绍 数据管理的原因:Docker中的容器一旦删除,容器本身的rootfs文件系统就会被删除,容器中的所有数据就会被删除.为了对一些需要持久化的数据,不随容器删除而删除,所以我们可以通过多个容 ...

  7. excel窗口独立显示/单独显示

    天赋异禀的亲,一看就懂!

  8. 第14讲:嵌入式SQL语言(基本技巧)

    一.交互式SQL的局限 & 嵌入式SQL的必要性 专业人员(如DBA)可以熟练地运用交互式SQL语言,但普通用户却不是那么容易上手,所以需要通过数据库应用程序来使用数据库.编写一个可以与数据库 ...

  9. C++ 函数 参数传递方式

    用函数调用所给出的实参(实际参数,actual arguments)向函数定义给出的形参(形式参数,formal arguments)设置初始值的过程,叫做参数传递(Argument Passing) ...

  10. Final发布文案+美工

    团队名称:探路者 1蔺依铭:http://www.cnblogs.com/linym762/(组长) 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www ...