我有几个单元测试,我需要确保方法生成的XML包含与预期的Xml文档相同的元素/值.
我在Java中使用了xmlunit,虽然它们有.net版本但它似乎不支持命名空间.在.net中有没有替代方法呢?
只要我可以比较2个Xml字符串并得到一个真/假的结果告诉我它们是否匹配,只要涉及到的数据,我很高兴...
我有2个xml文件:
问题出在属性前缀中.
<element xmlns:prefix1="namespace" prefix1:attribute="some value">Some text</element>
<element xmlns:prefix2="namespace" prefix2:attribute="some value">Some text</element>
Run Code Online (Sandbox Code Playgroud)
这两个xml是相同的,具有相同的命名空间,但具有不同的前缀.如果我与xmlunit比较 - >断言失败.我该怎么处理?
在类似()或相同()比较的情况下,我有错误:
预期的属性名称'message:MessageNameString'但是'null'
预期的属性名称'message:MessageVersion'但是'null'
预期的属性名称'null'但是'mes:MessageNameString'
预期的属性名称'null'但是'mes': MessageVersion"
我正在尝试成功运行XmlUnit,对我的工作非常有帮助.现在,我有一点问题,我不知道如何解决.我有一个java类,它有一个Set,当它转换为XML时,里面的元素可以有任何顺序.
当我在XmlUnit中尝试这两个文件时,它可以工作(Diff说它们是相似的):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Monitor>
<AvailableMeasures>
<MeasureDescriptorA name="netInput_mynetwork"></MeasureDescriptorA>
<MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor>
</AvailableMeasures>
</Monitor>
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Monitor>
<AvailableMeasures>
<MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor>
<MeasureDescriptorA name="netInput_mynetwork"></MeasureDescriptorA>
</AvailableMeasures>
</Monitor>
Run Code Online (Sandbox Code Playgroud)
但是当标签具有相同的名称(具有不同的属性)时,它不起作用(它混合了属性,并期望另一个标签中的属性):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Monitor>
<AvailableMeasures>
<MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor>
<MeasureDescriptor name="netInput_mynetwork"></MeasureDescriptor>
</AvailableMeasures>
</Monitor>
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Monitor>
<AvailableMeasures>
<MeasureDescriptor name="netInput_mynetwork"></MeasureDescriptor>
<MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor>
</AvailableMeasures>
</Monitor>
Run Code Online (Sandbox Code Playgroud)
有没有解决方法?
我想使用XMLUnit来比较两个相似的XML文件.
基本上每件事都是一样的,File1是副本File2,但在File2我已经改变了一个节点中某些元素的顺序.
我正在尝试运行一个测试,它比较这些文件并返回类似的结果,而不是将这些文件视为不同.
当父节点的顺序不同时,我遇到问题。例如:
示例 XML1
<level1>
<name>FirstParent</name>
<level2>
<somefield>AAA</somefield>
</level2>
<level2>
<somefield>BBB</somefield>
</level2>
</level1>
<level1>
<name>SecondParent</name>
<level2>
<somefield>CCC</somefield>
</level2>
<level2>
<somefield>DDD</somefield>
</level2>
</level1>
Run Code Online (Sandbox Code Playgroud)
示例 XML2
<level1>
<name>SecondParent</name>
<level2>
<somefield>DDD</somefield>
</level2>
<level2>
<somefield>CCC</somefield>
</level2>
</level1>
<level1>
<name>FirstParent</name>
<level2>
<somefield>BBB</somefield>
</level2>
<level2>
<somefield>AAA</somefield>
</level2>
</level1>
Run Code Online (Sandbox Code Playgroud)
当我调试 RecursiveElementNameAndTextQualifier 时,我发现它正在将 FirstParent 作为控制节点,将 SecondParent 作为测试节点。因此,正确地得出节点不同的结论。但我需要的是将 FirstParent 和 SeconParent 与其他文件中的正确匹配进行比较。
所以,似乎我需要首先对更高级别的节点进行排序(?)。
有谁知道我该如何克服这个问题?我应该以不同的方式检查/修改/实现什么,以将正确的父级串联传递给 ElementQualifier ?
也许,有了正确的方向,我就能开发出需要的东西。
这困扰了我好几天.我只需要通过比较找出第二个xml中缺少的节点.我试过xmlunit,但它并没有真正帮助我找到丢失的节点,因为它逐行比较.两个样本xml如下:xml1:
<test testcase="101">
<value="1">
<value="2">
<value="3">
</test>
Run Code Online (Sandbox Code Playgroud)
XML2:
<test testcase="101">
<value="3">
<value="2">
</test>
Run Code Online (Sandbox Code Playgroud)
请注意,value = 3实际上在第二个副本中它只是到达第一个节点,但我仍然认为它没有丢失.我如何找到丢失的节点值="1"?
如何配置 XmlUnit.Net 在比较两个文档时忽略 XML 声明?
假设我有以下控制文档:
<?xml version="1.0" encoding="utf-8"?>
<a><amount>1</amount></a>
Run Code Online (Sandbox Code Playgroud)
我想比较一下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a><amount>1</amount></a>
Run Code Online (Sandbox Code Playgroud)
比较应该没有差异。
我的期望是使用像这样的 NodeFilter 应该可以工作,但事实并非如此:
var diff = DiffBuilder.Compare(control)
.WithTest(test)
.WithNodeFilter(n => n.NodeType != XmlNodeType.XmlDeclaration)
.Build();
diff.Differences.Count().Should().Be(0);
Run Code Online (Sandbox Code Playgroud)
断言因两个差异而失败 - 一个是编码(大小写不同),另一个是独立属性。我对任何一个都不感兴趣。
我说n.NodeType != XmlNodeType.XmlDeclaration或n.NodeType == XmlNodeType.XmlDeclaration说都没有区别。
我正在使用 XMLUnit.Core v2.5.1。
有没有办法完全忽略 XMLUnit 中的空标签,以便在比较时不考虑它?前任:
<a>
<b/>
<c>data1</c>
<d>data2</d>
</a>
Run Code Online (Sandbox Code Playgroud)
和
<a>
<c>data1</c>
<d>data2</d>
</a>
Run Code Online (Sandbox Code Playgroud)
不应返回任何差异。是否有任何内置函数可以执行此操作?谢谢。
出于某种原因,执行以下脚本时,不仅会在日志中打印输出,还会在信息弹出对话框中打印输出.有人可以向我解释为什么会发生这种情况以及如何防止它发生?
import groovy.io.FileType;
import org.custommonkey.xmlunit.*;
def file1 = "somepath/file1.xml"
def file2 = "somepath/file2.xml"
def xml1 = new FileReader(file1)
def xml2= new FileReader(file2)
XMLUnit.setIgnoreWhitespace(true)
XMLUnit.setIgnoreComments(true)
XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true)
XMLUnit.setNormalizeWhitespace(true)
DetailedDiff myDiff = new DetailedDiff(new Diff(xml1, xml2));
List allDifferences = myDiff.getAllDifferences();
allDifferences.each { difference ->
log.info (difference)
}
Run Code Online (Sandbox Code Playgroud)
编辑:通过实验,我发现以下行:
List allDifferences = myDiff.getAllDifferences();
Run Code Online (Sandbox Code Playgroud)
是对话弹出的原因.我猜测getAllDifferenes()方法导致弹出对话框.
我仍然想要一些帮助来确定一个可行的替代方案,因为我试图比较两个xml文件并打印文件中的差异.
我想使用XMLUnit比较两个xml文件.我希望DetailedDiff不以不同的顺序报告相同的标签作为差异.例如,如果我使用这两个片段创建了一个DetailedDiff:
<a><b/><c/></a>
Run Code Online (Sandbox Code Playgroud)
和
<a><c/><b/></a>
Run Code Online (Sandbox Code Playgroud)
由于b和c标签乱序,DetailedDiff将创建两个差异.我已经尝试重写元素限定符,但它不会导致任何更改.我做错了什么或者这与XMLUnit无关?这里的参考是我用来比较两个xml文件的代码(不包括overrideElementQualifier调用).
public List<Difference> getDifferenceList(Reader file1, Reader file2) {
Diff d = new Diff(file1, file2); //I'm passing the args as FileReaders
d.overrideElementQualifier(new RecursiveElementNameAndTextQualifier());
detailedDiff = new DetailedDiff(d);
List<Difference> allDifferences = detailedDiff.getAllDifferences();
return allDifferences;
}
Run Code Online (Sandbox Code Playgroud)