测试之路2——对比XML文件1

才来几天,老大又给了我一个新的任务。不像以前的建100个任务工程那么坑爹,却还是顿时让我感觉压力山大。

因为在这之前,我改了他写的例程,用于生成新的任务项目,其实任务项目就是通过XML文件进行参数传递,底层早已经封装好了。但是问题出来了,你新建任务需要传过去一个XML文件,但是服务器端生成任务还会返回一个XML文件,而我对于服务器端并不了解,我只知道服务器生成了一个XML文件,但是它生成的XML中的参数是否和我传过去的参数相同?

所以老大要我写一个方法,去比对这两份XML文件。(自己传到服务器和服务器生成并返回的)

以后我都会称自己传到服务器为源文件,服务器生成返回的为目标文件

这一下倒是难到了我,因为第一,我对xml文件不熟;第二,我没有考虑好如何去对比xml文件。

首先,xml文件中都是以string字符串的形式写入,在java程序中,其实就是对比string。但是我不知道该怎么去比对这两个字符串,是比对字符串长度?不可能,源文件的长度肯定小于目标文件,目标文件会生成对应的任务名称,id等参数,而这些在源文件中是缺省的。

这让我感到绝望,不过好在有万能的baidu:他告诉我,java中有很多封装好的类,可以将xml文件直接进行转化,比如:DOM。

原来还可以这样,于是我又查了查Document类,略去基础的不说,直奔主题:

这个DOM类可以直接对xml文档操作,可以读取xml文件,并生成一个对象,这个对象就是xml文件的树形化(xml也是类似于树结构,dom相当于直接生成这个数结构),那么我就可以直接访问这个对象,对这个对象进行操作,比如可以得到子节点,得到根目录……

那么怎么使用dom呢?直接上代码不解释:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;  //需要引入的包
@Override
public boolean compare(String sourcePath, String targetPath) {
<span style="white-space:pre">	</span>boolean result=false;
<span style="white-space:pre">	</span>File sourceFile = new File(sourcePath);
<span style="white-space:pre">	</span>File targetFile = new File(targetPath);
<span style="white-space:pre">	</span>Document sourceDoc = builder.parse(sourceFile);
<span style="white-space:pre">	</span>Document targetDoc = builder.parse(targetFile);
<span style="white-space:pre">	</span>simpleCompare(sourceDoc, targetDoc);
<span style="white-space:pre">	</span>try {
<span style="white-space:pre">	</span>Document sourceDoc = builder.parse(sourceFile);
<span style="white-space:pre">	</span>Document targetDoc = builder.parse(targetFile);

<span style="white-space:pre">	</span>// DebugUtil.formatXML(sourceDoc);
<span style="white-space:pre">	</span>simpleCompare(sourceDoc, targetDoc);//简单对比

<span style="white-space:pre">	</span>} catch (SAXException e) {
<span style="white-space:pre">	</span>e.printStackTrace();
<span style="white-space:pre">	</span>} catch (IOException e) {
<span style="white-space:pre">	</span>e.printStackTrace();
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>return result;
}

上面代码大概就这么个意思,compare是个构造方法:方法内创建格式工厂,读取xml文件的路径,然后去解析这个xml文件,返回得到的Document对象(是一个树形的数据结构)。

那么实际就是操作sourceDoc和targetDoc这两个Document对象就可以了。

剩下那不是很简单?于是,我找到了Document的方法:getChildNodes(),返回所有孩子的节点,以链表的形式,我当然可以认为链表的名字就是xml标签名字,值为xml标签的值,所以我就可以进行对比了。于是又是洋洋洒洒一段代码。

public boolean simpleCompare(Document sourceDoc,Document targetDoc){
//		Element sourceRoot = sourceDoc.getDocumentElement();  //得到源文件的根节点
		Element targetRoot = targetDoc.getDocumentElement();	//得到目标文件的根节点

//		HashSet<String> sourceSet =new HashSet<String>();  //创建哈希表
//		HashSet<String> targetSet =new HashSet<String>();
//		HashSet<String> sourceNames=getNodeNames(sourceRoot,sourceSet);   //一个创建哈希表函数
//		HashSet<String> targetNames=getNodeNames(targetRoot,targetSet);

		NodeList sourceNodes = sourceDoc.getChildNodes();	 //得到源文件的孩子,为了进行对比
		NodeList targetNodes = targetDoc.getChildNodes();	 

		int sourceLength = sourceNodes.getLength();
		int targetLength = targetNodes.getLength();
		int i = 0,j = 0;
		for (i = 0; i < sourceLength; i++) {
			String name = sourceNodes.item(i).getNodeName();
			String value = sourceNodes.item(i).getNodeValue();
			for (j = 0; j < targetLength; j++) {
				if (name.equals(targetNodes.item(j).getNodeName())) {
					if (value.equals(sourceNodes.item(j).getNodeValue())) {

					}
					else {
						return false;//如果值不对,说明对比错误
					}
				}
			}
			if(j == targetLength){   //如果一直没有在目标文件中找到,说明对比错误
				return false;
			}
		}
		return true;
	}

本以为这样都就可以完成对比的任务了,但是当我拿两份内容一样的xml文件去对比,console里返回的都是false,这让我变得很忧伤。

至于为什么,肯定是哪里出现问题了,所以我要输出来看一看,到底出了什么错。

测试之路2——对比XML文件1,布布扣,bubuko.com

时间: 2024-10-13 00:00:32

测试之路2——对比XML文件1的相关文章

测试之路3——对比XML文件2

距离上一篇对比xml文件隔了很久,并不代表一直做了那么久. 其实上一次对比xml文件一直出错,其实我忽略了一个很简单的问题:我从根目录下得到的所有孩子,是这个根下的,而xml文件的组织形式如下,孩子也有可能是其他的根: <streams> <stream id = "979" presetid = "-1"> <h264> <profile>High</profile> <par_y>-1<

測试之路2——对照XML文件1

才来几天,老大又给了我一个新的任务.不像曾经的建100个任务project那么坑爹,却还是顿时让我感觉压力山大. 由于在这之前,我改了他写的例程,用于生成新的任务项目,事实上任务项目就是通过XML文件进行參数传递,底层早已经封装好了.可是问题出来了,你新建任务须要传过去一个XML文件,可是server端生成任务还会返回一个XML文件,而我对于server端并不了解,我仅仅知道server生成了一个XML文件,可是它生成的XML中的參数是否和我传过去的參数同样? 所以老大要我写一个方法,去比对这两

Java修炼之路——读取XML文件

这次来跟记录下java下如何操作xml文件.其实用过python去爬虫的话,那么应该很容易上手.java中有一个库dom4j就跟python中的lxml类似. 这里要重点强调下,在使用dom4j库的时候,其实它还有一个依赖包,就是jaxen.不添加的可是会报错的.(dom4j和jaxen的下载链接都整理好了在底部) 这里主要就是讲讲怎么用dom4j来读取的xml文件(可以直接从网络上加载,或者本地) //这个是官网上copy的,直接从加载文件 public class Foo { public

笔记:MyBatis Mapper XML文件详解 - 映射和参数

MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码.MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好. SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序): cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的引用. resultMap – 是最复杂也是最强大的元素,用来描述

android XML文件注释应该注意些什么

android的XML文件注释一般采用 <!--注释内容 -->的方式进行,但是有时候却不能进行注释,如 在XML中,形如    <Button           />      的表示方式,其中“/>”的含义表示这个XML中没有内文,他是一个最小组成单元,也就是说他的中间不能包含其他任何< >的代码,所以在<Button />中间注释会出现错误 对比整个XML文件,我们为什么可以在其中间注释呢,看代码 注意看到,在注释的前面有一个“>”符号,

AS3操作XML文件

好久没有写AS3程序了...马丹连个xml读取都不会了快.. 下面是一个很好的例子,自己使用Flex biulder刚写的: 代码如下: package { import flash.display.Sprite; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; public class TestXml extends Sprite { private var lod:URLL

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

利用XPath读取Xml文件

之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件:同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点. 不过,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT的配套标准颁布,它是XSLT以及我们后面要讲到的XPointer的重要组成部分. 在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基