XML字符串对比技巧二

简介:
之前都使用XmlUnit来对比xml字符串,今天发现当出现如下需求时,XMLUNIT无法满足或者说有bug,特自己写了对比方法。
需求:需要对比如下xml字符串,要求不对比其中的sign和time字段,其他字段都需要对比。
<?xml version="1.0" encoding="utf-8"?>
<SlotPermResult-array>
 <SlotPermResult>
  <appId>elbert_app_dsc007</appId>
  <slotIds>elb_wsi_001</slotIds>
  <time>1236586307734</time>
  <sign>822a379aec82755afaa9c63eea3b05b9</sign>
  <errorCode></errorCode>
  <errorMessage></errorMessage>
 </SlotPermResult>
 <SlotPermResult>
  <appId>elbert_apx_dsc008</appId>
  <slotIds></slotIds>
  <time>1236586307734</time>
  <sign>7ce9e326cb28b0084f7f331dcbb79f50</sign>
  <errorCode></errorCode>
  <errorMessage></errorMessage>
 </SlotPermResult>
 <SlotPermResult>
  <appId>elbert_app_dsc008</appId>
  <slotIds>elb_wsi_002</slotIds>
  <time>1236586307734</time>
  <sign>2ea135b978c75fb639fe65909283dcba</sign>
  <errorCode></errorCode>
  <errorMessage></errorMessage>
 </SlotPermResult>
</SlotPermResult-array>
尝试使用XmlUnit的方法
XMLAssert.assertXpathValuesEqual(path7,ExpXmlText,path7,ActXmlText);
结果发现只对第一个SlotPermResult节点的内容(子节点进行对比),不符合我们的需求。
原因XMLAssert根据Path找节点,只找第一个节点。所以只好自己写代码。
关键函数,需要根据Path找到符合这一路径的所有节点源码如下
 public static NodeList selectNodes(String express, String xmlStr) throws Exception
 {//查找节点,返回符合条件的节点集。
  DocumentBuilder builder = factory.newDocumentBuilder();
  InputStream is = String2InputStream(xmlStr);
  org.w3c.dom.Document doc = builder.parse(is);
  org.w3c.dom.Element root = doc.getDocumentElement();
  NodeList result = null;
  XPathFactory xpathFactory = XPathFactory.newInstance();
  XPath xpath = xpathFactory.newXPath();
  try {
   result = (NodeList) xpath.evaluate(express, root,
     XPathConstants.NODESET);
  } catch (XPathExpressionException e) {
   e.printStackTrace();
  }
  return result;
 }
辅助函数:由于我们要传入的都是XML字符串,所以在这之前需要把字符串转成Stream
源码如下
 static InputStream String2InputStream(String str) throws Exception{
     ByteArrayInputStream stream = new ByteArrayInputStream(str.getBytes("utf-8"));
     return stream;
 }
搞定之后,我们需要对所有需要对比的路径都放在List参数中传给对比函数,让对比函数逐一进行对比
对比函数源码如下
 @SuppressWarnings("unchecked")
 public static void assertEqualsNodes(String ExpXml,String ActXml,List list) throws Exception 
 {
  for(int i =0; i < list.size(); i++)
  {
   String path = list.get(i).toString();
   NodeList nlExp = XmlStringUtil.selectNodes(path, ExpXml);
   NodeList nlAct = XmlStringUtil.selectNodes(path, ActXml);
   Assert.assertEquals(path+"路径下的节点数目不相同:",nlExp.getLength(),nlAct.getLength());
   for(int j=0 ; j< nlExp.getLength(); j++)
   {
    Assert.assertEquals(path+"路径下第"+j+"个节点内容:",nlExp.item(j).getTextContent(),nlAct.item(j).getTextContent());
   }
   
   //Assert.assertEquals(nlExp,nlAct);
  }
 }
调用时候的代码片段如下:
 String ExpXmlText = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    + "<SlotPermResult-array>  " + "<SlotPermResult>    "
    + "<appId>elbert_app_dsc007</appId>    "
    + "<slotIds>elb_wsi_001</slotIds>    "
    + "<time>1236586307734</time>    "
    + "<sign>822a379aec82755afaa9c63eea3b05b9</sign>    "
    + "<errorCode></errorCode>    "
    + "<errorMessage></errorMessage>  " + "</SlotPermResult>  "
    + "<SlotPermResult>    "
    + "<appId>elbert_apx_dsc008</appId>    "
    + "<slotIds></slotIds>    " + "<time>1236586307734</time>    "
    + "<sign>7ce9e326cb28b0084f7f331dcbb79f50</sign>    "
    + "<errorCode></errorCode>    "
    + "<errorMessage></errorMessage>  " + "</SlotPermResult>  "
    + "<SlotPermResult>    "
    + "<appId>elbert_app_dsc008</appId>    "
    + "<slotIds>elb_wsi_002</slotIds>    "
    + "<time>1236586307734</time>    "
    + "<sign>2ea135b978c75fb639fe65909283dcba</sign>    "
    + "<errorCode></errorCode>    "
    + "<errorMessage></errorMessage>  "
    + "</SlotPermResult></SlotPermResult-array>";
  List<String> Nodes = new ArrayList<String>();
  Nodes.add("/SlotPermResult-array/SlotPermResult/appId");
  Nodes.add("/SlotPermResult-array/SlotPermResult/slotIds");
  Nodes.add("/SlotPermResult-array/SlotPermResult/errorCode");
  Nodes.add("/SlotPermResult-array/SlotPermResult/errorMessage");
。。。。(在这里通过测试执行得到ActXmlTest)
  assertEqualsNodes(ExpXmlText, ActXmlTest,Nodes);


本文转自elbertchen 51CTO博客,原文链接:http://blog.51cto.com/linkyou/282601,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
XML 存储 BI
如何把一个 ABAP 类的实例,序列化成 XML 字符串试读版
如何把一个 ABAP 类的实例,序列化成 XML 字符串试读版
13 0
|
7月前
|
XML 存储 JavaScript
【JavaSE专栏89】Java字符串和XML数据结构的转换,高效灵活转变数据
【JavaSE专栏89】Java字符串和XML数据结构的转换,高效灵活转变数据
|
5月前
|
XML JavaScript API
框架选修课之dom4j解析xml字符串实例
框架选修课之dom4j解析xml字符串实例
52 1
|
9月前
|
XML 数据格式
把字符串写入xml中
把字符串写入xml中
51 0
|
XML JavaScript 数据格式
JQuery 动态XML字符串添加节点
今天实现了动态的给一个XML字符串添加节点。
123 0
|
XML 数据格式
hutool解析XML字符串
hutool解析XML字符串
|
SQL 开发框架 Java
开发踩坑-mapper.xml中字符串类型的==
关于mapper.xml中判断字符串类型的变量的==
223 0
|
XML Web App开发 JavaScript
使用JavaScript调用Microsoft XMLDOM库进行XML字符串的解析
使用JavaScript调用Microsoft XMLDOM库进行XML字符串的解析
132 0
使用JavaScript调用Microsoft XMLDOM库进行XML字符串的解析