zoukankan      html  css  js  c++  java
  • 測试之路3——对照XML文件2

    距离上一篇对照xml文件隔了非常久,并不代表一直做了那么久。

    事实上上一次对照xml文件一直出错,事实上我忽略了一个非常easy的问题:我从根文件夹下得到的全部孩子,是这个根下的,而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  tanlee
    	public String standardXML(String xml)
    	{
    		xml = xml.replace("
    ", "").replaceAll("(?<=>)\s+(?=<)", "");
    		return xml;
    	}

    这样就基本实现了功能,最终能返回一些true了,通过人工对照发现自己的自己主动化測试程序尽管简单,但还是能实现功能的。

    可是,问题又来了,怎么给自己的源文件加入新的标签,以适应server那边添加的參数?看来改进的地方还非常多,仅仅能下次再改了。


  • 相关阅读:
    安卓学习-界面-ui-GirdView
    安卓学习-界面-ui-AutoCompleteTextView
    安卓学习-界面-ui-Adapter
    安卓学习-界面-ui-ListView
    安卓学习-界面-ui-ImageView
    安卓学习-界面-ui-AnalogClock、DigitalClock和Chronometer
    clientdataset生成sql
    安卓学习-界面-ui-ToggleButton Switch
    DOM通过ID或NAME获取值
    DOM基本代码二
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4283521.html
Copyright © 2011-2022 走看看