<p>之前都使用XmlUnit来对比xml字符串,今天发现当出现如下需求时,XMLUNIT无法满足或者说有bug,特自己写了对比方法。</p>
<p>需求:需要对比如下xml字符串,要求不对比其中的sign和time字段,其他字段都需要对比。</p>
<p><?xml version="1.0" encoding="utf-8"?><br>
<SlotPermResult-array><br>
<SlotPermResult><br>
<appId>elbert_app_dsc007</appId><br>
<slotIds>elb_wsi_001</slotIds><br>
<time>1236586307734</time><br>
<sign>822a379aec82755afaa9c63eea3b05b9</sign><br>
<errorCode></errorCode><br>
<errorMessage></errorMessage><br>
</SlotPermResult><br>
<SlotPermResult><br>
<appId>elbert_apx_dsc008</appId><br>
<slotIds></slotIds><br>
<time>1236586307734</time><br>
<sign>7ce9e326cb28b0084f7f331dcbb79f50</sign><br>
<errorCode></errorCode><br>
<errorMessage></errorMessage><br>
</SlotPermResult><br>
<SlotPermResult><br>
<appId>elbert_app_dsc008</appId><br>
<slotIds>elb_wsi_002</slotIds><br>
<time>1236586307734</time><br>
<sign>2ea135b978c75fb639fe65909283dcba</sign><br>
<errorCode></errorCode><br>
<errorMessage></errorMessage><br>
</SlotPermResult><br>
</SlotPermResult-array></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 < 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< 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 = "<?xml version=/"1.0/" encoding=/"utf-8/"?>"<br>
+ "<SlotPermResult-array> " + "<SlotPermResult> "<br>
+ "<appId>elbert_app_dsc007</appId> "<br>
+ "<slotIds>elb_wsi_001</slotIds> "<br>
+ "<time>1236586307734</time> "<br>
+ "<sign>822a379aec82755afaa9c63eea3b05b9</sign> "<br>
+ "<errorCode></errorCode> "<br>
+ "<errorMessage></errorMessage> " + "</SlotPermResult> "<br>
+ "<SlotPermResult> "<br>
+ "<appId>elbert_apx_dsc008</appId> "<br>
+ "<slotIds></slotIds> " + "<time>1236586307734</time> "<br>
+ "<sign>7ce9e326cb28b0084f7f331dcbb79f50</sign> "<br>
+ "<errorCode></errorCode> "<br>
+ "<errorMessage></errorMessage> " + "</SlotPermResult> "<br>
+ "<SlotPermResult> "<br>
+ "<appId>elbert_app_dsc008</appId> "<br>
+ "<slotIds>elb_wsi_002</slotIds> "<br>
+ "<time>1236586307734</time> "<br>
+ "<sign>2ea135b978c75fb639fe65909283dcba</sign> "<br>
+ "<errorCode></errorCode> "<br>
+ "<errorMessage></errorMessage> "<br>
+ "</SlotPermResult></SlotPermResult-array>";<br>
List<String> Nodes = new ArrayList<String>();<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>
分享到:
相关推荐
FreeMarker是一个强大的、开源的模板引擎,主要用于生成动态HTML、XML或其他格式的...在阅读《FreeMarkerDemo》项目中的代码,你会更深入地理解这些概念,并可能发现更多关于FreeMarker操作字符串的技巧和最佳实践。
6. **字符串比较**:使用`equals()`或`compareTo()`方法进行字符串内容的比较,注意区分字面量和引用的比较。 7. **正则表达式**:强大的字符串匹配工具,能进行复杂的查找、替换和验证操作。 此外,字符串处理还...
7. **XML/JSON解析**:字符串也可以是XML或JSON格式的数据,通过解析库如`xml.etree.ElementTree`或`json`模块,可以将字符串转换为结构化的数据对象。 8. **字符串比较**:在编程中,我们经常比较字符串,比如排序...
2. **Oppgave2.bas**: "Oppgave"在挪威语中意为“任务”或“作业”,所以这可能是一个解决特定字符串问题的示例代码,可能是字符串的查找、替换或格式化。 3. **iinstr.bas**: "iInstr"是Visual Basic中的一个内置...
本篇文章主要介绍了C#语言中的字符串处理方法及技巧,包括各种字符串操作函数的应用场景与实现方式,适用于需要进行字符串处理的程序开发工作。 #### 描述详解: 在C#编程中,字符串处理是一项非常基础但又极其重要...
5. **strings.bas**:这可能是包含多种字符串处理技巧的综合示例,可能涵盖了字符串操作的各种方面,如比较、替换、删除、插入等。 6. **CharCode.BAS** 和 **chrcode.bas**:这两个例子可能涉及到字符编码和转换。...
这些只是C#字符串处理技术的一部分,实际应用中还有许多高级用法和技巧,例如处理Unicode字符、使用Regular Expression进行复杂的文本匹配、处理XML或JSON字符串等。深入理解并熟练掌握这些知识,将极大地提升C#编程...
- Jackson库同样提供了反向转换功能,使用`writeValueAsString`方法将JSON对象转换成XML字符串。 - 使用JsonXML Java库:这个库专门用于JSON到XML的转换,提供了简单易用的API。 - Google的Gson库可以通过第三方...
然而,在XML中直接使用一些特殊字符,比如大于(>)、小于(<)、等于(=)、单引号(')和双引号(")等,可能会导致XML解析错误,因为这些字符在XML文档中有特定的含义。为了解决这个问题,Mybatis提供了一些处理...
9. **字符串比较**:Python中的字符串比较是基于字典序的,理解这一点对于排序、查找等操作至关重要。 10. **字符串方法**:Python的`str`类提供了丰富的内置方法,如`startswith()`、`endswith()`检查字符串开头或...
- 《C#字符串操作技巧总结》:了解字符串的各种操作,包括格式化、替换、比较等。 - 《C#数组操作技巧总结》:学习数组的创建、初始化、遍历以及各种操作方法。 - 《C#中XML文件操作技巧汇总》:掌握读写XML文件的...
综上所述,"汇编语言解析xml源码"是一个涉及底层编程技巧、字符串处理、内存管理和错误处理等多个领域的复杂项目。对于熟悉汇编语言的人来说,这是一个挑战性的任务,也是一个深入理解计算机系统工作原理的好机会。
例如,使用预处理技巧(如查找表)减少字符串比较的次数,或者在内存充足时一次性加载整个XML文件。 通过以上步骤,你可以构建一个基本的XML解析器。然而,对于复杂的XML文档,这种方法可能会变得复杂且难以维护。...
2. **XML美化工具**:为了方便开发者,有许多在线和桌面应用程序提供XML美化功能,如XMLStarlet、Pretty Diff、XML Marker等。这些工具能够自动处理XML的格式化工作,只需要输入未格式化的XML代码,点击“格式化”...
- 实体引用:用于表示特殊字符或字符串,如`&`代表`&`。 3. XML命名空间: - 在XML中,通过命名空间解决标签冲突问题,例如`xmlns="http://example.com"`定义了一个默认命名空间。 - 使用前缀与URI结合来...
2. 将字典或数组转化为JSON字符串: ```objective-c NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; NSString *jsonString = [[NSString alloc] ...
例如,在解析XML文件时,可能需要将属性值从字符串转换为整数或浮点数,以便进行数值运算或比较。 #### 四、TinyXML的局限性与适用场景 TinyXML虽然轻便,但在处理大型或复杂的XML文档时,其性能和功能可能会受到...
在C#编程中,有时我们需要将用户输入或者从其他数据源获取的字符串转换为整型数值,以便进行数学计算或与其他整型数据进行比较。在本篇内容中,我们将探讨如何使用`int.TryParse()`方法来实现这个转换过程,并通过一...
1. **转换功能**:用户可以输入或粘贴JSON或XML字符串,然后选择转换目标,工具会自动将一种格式转换为另一种。 2. **格式化**:工具可以对输入的JSON或XML进行美化,使其更易读,通过缩进和换行来展示数据结构。 3....