`
linkyou66
  • 浏览: 228583 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

XML字符串对比技巧二

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

相关推荐

    Tinyxml 源代码(VC6 & VS2005)

    老版本的TinyXML“保留”了字符实体,而在新版本中它们会被转化成字符串。 另外,所有字符都可以用它的Unicode编码数字来指定, " "和" "都表示不可分的空格字符。 打印 TinyXML有几种不同的方式来打印输出,...

    C#编程经验技巧宝典

    85 &lt;br&gt;0130 复制字符串中指定的字符 85 &lt;br&gt;0131 巧截字符串的数字 86 &lt;br&gt;0132 如何存储变长字符串 86 &lt;br&gt;0133 在进行字符串比较时忽略大小写 87 &lt;br&gt;0134 如何去除字符串尾空格 87 ...

    JavaScript王者归来part.1 总数2

     9.2.1 比较字符串   9.2.2 抽取和检索子串   9.2.3 连接拆分字符串   9.2.4 字符串的模式匹配--一个字符串格式校验的例子   9.2.5 其他方法   9.3 字符串与字符数组   9.4 字符串与文本处理--...

    PHP和MySQL WEB开发(第4版)

    4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与函数编写 5.1 代码重用的好处 5.1.1 成本 5.1.2 可靠性 5.1.3 一致性 5.2 使用require()和include()函数 5.2.1 文件扩展名和...

    PHP和MySQL Web开发第4版pdf以及源码

    4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与函数编写 5.1 代码重用的好处 5.1.1 成本 5.1.2 可靠性 5.1.3 一致性 5.2 使用require()和include()函数 5.2.1 文件...

    PHP和MySQL Web开发第4版

    4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与函数编写 5.1 代码重用的好处 5.1.1 成本 5.1.2 可靠性 5.1.3 一致性 5.2 使用require()和include()函数 5.2.1 文件...

    ASP.NET编程之道.part1.rar

    陷阱26 使用查询字符串在页面间传递参数 陷阱27 通用数据类型运算产生的陷阱 陷阱28 在模态窗口中下载文件 陷阱29 构造方法中调用虚方法的陷阱 陷阱30 使用值类型进行线程同步 第4章 开发人员意识中的20个常见谬误 ...

    PHP网络编程技术与实践 源码

    2.3.3 字符串比较 2.3.4 字符串的转义 2.3.5 字符串的格式化 2.4 PHP的日期时间处理 2.4.1 时间与日期的显示操作 2.4.2 时间与日期的格式化输出 2.5 PHP的URL处理 2.5.1 URL字符串的处理 2.5.2 Base64 编码解码 2.6 ...

    PHP开发实战1200例源码

    实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式 147 实例116 验证电话号码的格式是否正确 147 实例117 验证Email地址格式是否正确 148 实例118 验证IP地址...

    C#开发经验技巧宝典

    0909 如何对字符串进行查询 532 0910 如何进行单条数据的添加 533 0911 如何进行批量数据的添加 533 0912 如何对数据进行修改 534 0913 如何对数据进行删除 534 0914 对数据库数据进行局部删除 534 ...

    .net性能优化宝典

    1.2.1 使用 StringBuilder 做字符串连接... 5 1.2.2 避免不必要的调用 ToUpper 或 ToLower 方法... 5 1.2.3 最快的空串比较方法... 6 1.3 多线程... 6 1.3.1 线程同步... 6 1.3.2 使用 ThreadStatic 替代 ...

    《JavaScript实例精通》[源代码]

    3_2.htm 在字符串中查找指定字符。 3_3.htm 提取字符串中的字串。 3_4.htm 替换字符串中的指定字符。 3_5.htm 将字符串分解为数组。 3_6.htm 字符串大小写的书写和判断。 第4章(\4) 示例描述:数组技术...

    JavaScript实例精通

    3_2.htm 在字符串中查找指定字符。 3_3.htm 提取字符串中的字串。 3_4.htm 替换字符串中的指定字符。 3_5.htm 将字符串分解为数组。 3_6.htm 字符串大小写的书写和判断。 第4章(\4) 示例描述:数组技术...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式 147 实例116 验证电话号码的格式是否正确 147 实例117 验证Email地址格式是否正确 148 实例118 验证IP地址...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式 147 实例116 验证电话号码的格式是否正确 147 实例117 验证Email地址格式是否正确 148 实例118 验证IP地址...

Global site tag (gtag.js) - Google Analytics