测试之路3——对比XML文件2
来源:互联网 发布:php自动发卡平台 编辑:程序博客网 时间:2024/06/06 20:52
距离上一篇对比xml文件隔了很久,并不代表一直做了那么久。
其实上一次对比xml文件一直出错,其实我忽略了一个很简单的问题:我从根目录下得到的所有孩子,是这个根下的,而xml文件的组织形式如下,孩子也有可能是其他的根:
<streams> <stream id = "979" presetid = "-1"> <h264> <profile>High</profile> <par_y>-1</par_y> <fr>source</fr> <cqquantizer>0</cqquantizer> <deviceid>0</deviceid> <qualitylevel>0</qualitylevel> <simhd> <deblock>0</deblock> <deinterlace>2</deinterlace> <denoise>0</denoise> <delight>0</delight> <saturation>0</saturation> <hue>0</hue> </simhd> </h264> <aac> <profile>LC</profile> <channel>1</channel> <bitrate>12000</bitrate> </aac> </stream></streams>这里可以把streams当做所有的根,但是它下面有stream,stream下面还有h264和aac两个节点,h264又有很多节点 ,而h264本身并没有参数值。
所以我得到的children只是得到stream,我需要遍历孩子,直到它没有某个孩子不再有孩子,再返回。
这么想来,是自己以前学数据结构学的不好,我实际要做的就是遍历树的每一片叶子。于是,我开始遍历整个xml树了。
可是我该怎么遍历,还是像数据结构上说的那样,先根,中根,后根?其实,我并不需要一起去遍历两个xml树,我只要遍历一个xml树(源文件),然后去比对目标文件的xml树就可以了。因为我发现,这我这里目标文件的叶子比源文件的多;且目标文件的叶子在一般情况下都包括目标文件。所以我以源文件为参照物,去寻找目标文件是否存在该节点,如果不存在,则错误;再去比对参数,如果参数不同,则错误。
xml文件中可能存在名字相同,但是实际位置不同的节点,所以对比的节点必须相对位置也相同,所以这也降低了对比难度。所以我可以简单写出对比的测试程序:
//简单对比方法://传递参数:源文件,返回的目标文件//返回值:true表示XML对比一样//修改日期:2014.5.26 tanlee//对比策略:如果源文件有标签,寻找目标文件是否有对应标签,个数如果不相同public boolean simpleCompare(Document sourceDoc,Document targetDoc) {Element sourceRoot = sourceDoc.getDocumentElement();HashSet<String> sourceSet =new HashSet<String>();HashSet<String> sourceNames = getNodeNames(sourceRoot,sourceSet);//将所有标签元素提取出来,建立哈希表,方便寻找所有标签Iterator<String> sIterator=sourceNames.iterator();//迭代器去遍历while(sIterator.hasNext()) //遍历所有源文件的标签{String sName = sIterator.next(); //遍历迭代器得到相应的标签名字NodeList snodeList1 = sourceDoc.getElementsByTagName(sName);//根据名字寻找对应的子节点int length1 = snodeList1.getLength();NodeList snodeList2 = targetDoc.getElementsByTagName(sName);//根据源文件中的标签寻找对应的int length2 = snodeList2.getLength();;if(length1 < length2)//当源文件长度小于目标文件,进行判断{//System.out.println("节点的元素个数不同:" + " " + sName + " " + "源文件个数:" //+ length1 + " " + "目标文件个数:" + length2 );for(int i = 0,j = 0;i < length1;i++) //对nodelist1进行遍历{String ssValue = new String("cao");String tValue = new String("cao");ssValue = sourceDoc.getElementsByTagName(sName).item(i).getFirstChild().getNodeValue();for(j =0;j < length2;j++)//内部循环对比,如果找不到和它相等的值,返回错误{tValue = targetDoc.getElementsByTagName(sName).item(j).getFirstChild().getNodeValue();if(ssValue != null && ssValue != null && ssValue.equals(tValue))//表示找不到{break;}else if(ssValue == null && tValue == null){break;}}if(j == length2) //到达循环次数,还是没有找到,说明没有值对应,可以返回错误{System.out.println("没有找到标签对应的值");return false;}}}else if(length1 == length2) //长度相同的情况下,进行对比,对比的条件是,如果目标文件能找到且值相同则返回true{for(int i = 0;i < length1;i++) //对nodelist1进行遍历{String ssValue = new String(" ");String tValue = new String(" ");//如果找不到该节点if(targetDoc.getElementsByTagName(sName).item(i).getFirstChild() == null ){if(sourceDoc.getElementsByTagName(sName).item(i).getFirstChild() != null ){System.out.println("源文件有该标签,而目标文件没有");return false; //如果源文件有节点}else break;}ssValue = sourceDoc.getElementsByTagName(sName).item(i).getFirstChild().getNodeValue();tValue = targetDoc.getElementsByTagName(sName).item(i).getFirstChild().getNodeValue();if(ssValue != null&&!ssValue.equals(tValue))//表示找不到{//System.out.println("Error");return false;}else {//System.out.println(ssValue);}}}else{System.out.println("目标文件节点长度小于源文件节点长度");return false ; //其他情况就是目标文件的节点长度小于源文件的节点长度,即找不到对应节点,直接返回错误}}return true;}
不过,返回的结果都是false,这让我惊呆了,难道是我又写错了?我只能把遍历到的节点输出来,果真节点都不在,这是什么原因?
老大这个时候提醒了我,解析xml的时候需要把xml文件进行格式化,我把源文件和目标文件导出来看一看,一个是3KB,另一个是5KB,很显然就算某些元素信息有差别,文件大小也不会相差如此之大,所以我打开看了一下:源文件没有空格和回车,而目标文件有很多空格和回车,我于是理解他们的格式是不一样的。
需要自己去标准化吗?好像不用了,里面已经写好了方法。是用正则,我不是很懂,至少用了再去学吧,代码如下:
//标准化传入的XML文件的字符串//传递参数:源文件的String,返回的true//返回值:修改过的String//修改日期:2014.5.29 tanleepublic String standardXML(String xml){xml = xml.replace("\r\n", "").replaceAll("(?<=>)\\s+(?=<)", "");return xml;}
这样就基本实现了功能,终于能返回一些true了,通过人工对比发现自己的自动化测试程序虽然简单,但还是能实现功能的。
但是,问题又来了,怎么给自己的源文件添加新的标签,以适应服务器那边增加的参数?看来改进的地方还很多,只能下次再改了。
- 测试之路3——对比XML文件2
- 测试之路2——对比XML文件1
- 两个XML文件进行对比
- xml与access数据读取对比测试
- XML——XML文件约束之DTD详解
- XML——XML文件约束之DTD详解
- UiAutomator自动化测试之创建build.xml文件
- 对比两个xml文件的标签
- XML文件四种解析方式对比
- 几种读大文件方法的效率对比测试
- 几种读大文件方法的效率对比测试
- dom4j写xml文件测试
- FileMerge ——文件对比工具使用
- 文件对比工具——>Beyond Compare
- HelloWorld系列之——dom4j读xml文件
- IOS开发之—xml文件解析(NSXMLParser类)
- Android学习笔记之—XML文件的序列化
- Android学习笔记之—采用Pull解析XML文件
- 无奈很多,前进却是必须的
- listview布局操作----将item绑定到activity中
- 让iis支持下载apk,ipa文件
- 未能启用Hyper-V
- 理解对象序列化文件格式
- 测试之路3——对比XML文件2
- VS2013里面新建项目未找到Windows Phone选项
- 计算机系统:深入理解计算机系统--第三章摘抄
- bzoj1618[Usaco2008 Nov]Buying Hay 购买干草
- python3 学习-1(实现简单的服务器与客户端)
- 教你怎么阅读外文文献
- java.io.Serializable接口实现序列化
- Matlab 文件操作
- 谁说技术男没有人文情怀:当旅途遇到生命赞歌