- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有以下输入、预期输出和实际输出 xml:
input.xml
<Request>
<EmailSubjectLine>Main Contact & No Reported To</EmailSubjectLine>
<ProductRq>
<Signon>
<ClientDt>1/6/2017 11:25:45 AM</ClientDt>
<CustLangPref>en-US</CustLangPref>
</Signon>
<SvcRq>
<RqUID>xxxxxxxx-2802-xxxx-xxxx-bf8361xxxxxx</RqUID>
<NotificationRq>
<TransactionRequestDt>2017-01-06</TransactionRequestDt>
<Currency>USD</Currency>
</NotificationRq>
</SvcRq>
</ProductRq>
<!-- rest of input -->
</Request>
预期输出.xml
<ProductRq xmlns="http://test.org/standards/intake">
<Audit>
<TransID>Test</TransID>
</Audit>
<Signon>
<ClientDt>1/6/2017 11:25:45 AM</ClientDt>
<CustLangPref>en-US</CustLangPref>
</Signon>
<SvcRq>
<RqUID>xxxxxxxx-2802-xxxx-xxxx-bf8361xxxxxx</RqUID>
<NotificationRq>
<RqUID>Test</RqUID>
<TransactionRequestDt>2017-01-06</TransactionRequestDt>
<Currency>USD</Currency>
</NotificationRq>
</SvcRq>
<!-- rest of expected-output -->
</ProductRq>
实际输出.xml
<ProductRq xmlns="http://test.org/standards/intake">
<Audit>
<TransID>123534Abwe-asdcv-1258qw-asd</TransID>
</Audit>
<Signon>
<ClientDt>1/6/2017 11:25:45 AM</ClientDt>
<CustLangPref>en-US</CustLangPref>
</Signon>
<SvcRq>
<RqUID>xxxxxxxx-2802-xxxx-xxxx-bf8361xxxxxx</RqUID>
<NotificationRq>
<RqUID>CG-17Dawe-12354-Hw35Sf</RqUID>
<TransactionRequestDt>2017-01-06</TransactionRequestDt>
<Currency>USD</Currency>
</NotificationRq>
</SvcRq>
<!-- rest of actual-output -->
</ProductRq>
我将它们与以下 Diff 设置进行比较:
MyTest.java
Diff diff = DiffBuilder
.compare(xmlExpectedOutput)
.withTest(xmlOutput)
.normalizeWhitespace()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder()
.whenElementIsNamed("Audit")
.thenUse(ElementSelectors.byXPath("./TransID", ElementSelectors.byName))
.whenElementIsNamed("NotificationRq")
.thenUse(ElementSelectors.byXPath("./RqUID", ElementSelectors.byName))
.elseUse(ElementSelectors.byNameAndText)
.build()
))
.checkForSimilar()
.build();
当我运行上述输入并与预期输出.xml 进行比较时,我得到以下差异:
[Expected child '{http://test.org/standards/intake}RqUID' but was 'null' - comparing <RqUID...> at /ProductRq[1]/SvcRq[1]/NotificationRq[1]/RqUID[1] to <NULL> (DIFFERENT), Expected child 'null' but was '{http://test.org/standards/intake}RqUID' - comparing <NULL> to <RqUID...> at /ProductRq[1]/SvcRq[1]/NotificationRq[1]/RqUID[1] (DIFFERENT)]
我不明白为什么我的元素选择器不起作用,我使用它是否不正确?我的目标是每当找到 TransmissionId 或 NotificationRq/RqUID 时,仅通过名称将它们与预期的输出版本进行匹配,否则使用其他元素的名称和文本,因为这些元素包含唯一生成的 id,这些 id 会更改每次测试运行并且无法预测(着眼于稍后创建更复杂的选择器,例如通过名称和属性比较 ProductRq,因为命名空间已添加到此)。我是否遗漏了一些东西,我是否能够将 2 个 XPath 选择器组合在一起,而不是几个 when/then 行和默认情况?
注意:xml是通过xslt转换的。 PROoductRq 上的命名空间在源文档中不存在;复制源,将命名空间添加到 ProductRq,然后与一些元素删除/修改/添加一起发送以进行输出
最佳答案
XMLUnit 表示 NotificationRq
内的 RqUID
元素不匹配,当然它们是不同的。
.whenElementIsNamed("NotificationRq")
.thenUse(ElementSelectors.byXPath("./RqUID", ElementSelectors.byName))
表示:当 XMLUnit 尝试为 NotificationRq
元素查找合作伙伴时,它必须搜索具有 RqUID
子元素的 NotificationRq
- 并且仅使用 RqUID
元素。
它不会为任何其他元素设置任何规则,特别是 RqUID
本身。对于 RqUID
元素,应用默认规则并且
.elseUse(ElementSelectors.byNameAndText)
表示:XMLUnit 仅接受两个元素作为对,前提是它们的名称和嵌套文本匹配。但所涉及的 RqUID
元素的情况并非如此。
你的整个ElementSelector
说
Audit
具有任意内容的 TransID
子项,则匹配它们。NotificationRq
具有任意内容的 RqUID
,则匹配它们。这不适合你的例子。查看您可能想要的 XML
Audit
的 TransId
子级的嵌套文本NotificationRq
的 RqUID
子级的嵌套文本对于“名为 foo
的元素,如果它是名为 bar
的元素的子元素”,没有内置谓词,它可能类似于
Predicate<Element> transIdInAudit = e -> {
if (e == null || e.getParentNode() == null) {
return false;
}
return "TransID".equals(e.getLocalName()) && "Audit".equals(e.getParentNode().getLocalName());
};
您可能希望使其具有普遍性:-)
这样你就可以使用
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder()
.when(transIdInAudit)
.thenUse(ElementSelectors.byName)
.when(rqUIDInNotificationRq) // similar to transIdInAudit
.thenUse(ElementSelectors.byName)
.elseUse(ElementSelectors.byNameAndText)
.build())
也许您真的想匹配 SvcRq
(如果它们具有匹配的 RqUID
),也许不是。如果是这样,您将使用当前用于 NotificationRq
的结构。
这本身并不足以忽略匹配的 TransId
和 RqUID
元素的嵌套文本,它只会确保 XMLUnit 将选择您想要的节点使用。对于嵌套文本,您需要一个 DifferenceEvaluator
。
鉴于您默认使用 ElementSelectors.byNameAndText
,您知道所有匹配节点的嵌套文本都是相同的,除了您想要忽略内容的两个特定元素之外。所以一个 DifferenceEvaluator
就像
DifferenceEvaluators.chain(DifferenceEvaluators.Default,
DifferenceEvaluators.downgradeDifferencesToEqual(ComparisonType.TEXT_VALUE))
应该可以。
关于java - xmlunit:ElementSelectors.conditionalBuilder 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42207994/
如何配置 XmlUnit.Net 在比较两个文档时忽略 XML 声明? 假设我有以下控制文档: 1 我想比较的是: 1 比较应该没有差异。 我的期望是像这样使用 NodeFilter 应该可行,但
我想使用XMLUnit比较两个相似的 XML 文件。 基本上一切都是一样的, File1 是 File2 的副本,但在 File2 中我更改了其中一些元素的顺序节点。 我正在尝试运行一个测试,比较这些
XMLUnit 2 中有没有办法使这两个文档返回相同(或相似)?我可以做一些预处理来获取子节点,但我想看看是否可以直接使用 XMLUnit 来完成。 文档1: test 文档2: test 最佳答案
我熟悉忽略属性值的差异,但是完全按名称忽略属性的正确方法是什么?如何使这两个文档评估为相似? 文档1: 文档2: 最佳答案 这最终对我有用。 (如果有其他解决方案,请告诉我) DiffBuilde
我想比较两个 XML 文件,但仅基于标签值,我还需要比较整个标签,例如 text1 text2 我需要实现的是表明不一样,我不在乎text1 text2不同之处。问题是,默认情况下 XMLUnit 将
我正在使用 XMLunit 来比较以下 XML XML 1 Some Text XML 2 Some Text 我希望只有元素 2 会有所不同,但是我得到的元素 1 却有这样的差异 "
我有两个要比较的 XML 文件。我正在使用 XMLUnit 2。但是元素可能会乱序(包括子元素排序)下面的所有三个示例都需要被视为等效: Test 01 T
我在 XMLUnit 的帮助下比较两个 xml 文件现在如果我使用这段代码来比较 @Test public void testForEquality() throws Exception { Str
我需要区分包含生成的 .xml 和 .wsdl 文件的大型目录结构。生成的 .xml 文件在子元素出现的顺序上有所不同。 XmlUnit Diff.similar() 方法应该处理这种情况: '如果两
我想在测试中比较两个 xml 字符串,但由于空格,测试一直失败。 @Test public void testForEquality() throws Exception { String myCo
我有以下 testXML test bee 虽然 templateXML 看起来像这样 我希望 XMLUnit 返回缺少的元素,在本
我有一个使用 JDOM2 库生成 XML 文档的应用程序。在我的单元/集成测试中,我需要将生成的文档与手工制作的示例文档进行比较以确定是否相等。 对于标准 org.w3c.dom.Document 对
有没有办法完全忽略 XMLUnit 中的空标签,以便在比较时不考虑它?例如: data1 data2 和 data1 data2 不应返回任何差异。是否有任何内置函数可以执行此操作?谢谢。
使用 xmlunit-2 比较 XML 时,我似乎无法弄清楚如何设置命名空间 尝试过: @Test public void testDiff_withIgnoreWhitespaces_
我正在使用 XMLUnit 来比较两个 XML。当我将测试类手册作为 jUnit 测试执行时,这工作得很好。 但现在我想调用另一个类(class)的测试。我可以执行 testMethod,但没有任何反
您好,我正在尝试使用 XML 单元 RecursiveElementNameAndTextQualifier ,但我的下面的测试失败了。当我在下面的测试 xml 文件中交换 foo3 和 foo2 的
这个问题已经有答案了: Compare two XML strings ignoring element order (9 个回答) 已关闭 7 年前。 我正在 JUnit 测试中将保存的示例 xml
我需要比较两个具有不同实体顺序的 XML 文件。 1 2 3 4
我目前正在尝试使用 XML Unit。我有两个文件,测试和控制,我想比较。 我的场景是我只想测试两个的东西(版本和id)而忽略其余的。 这是我尝试做的: final org.xmlunit.di
尝试让这两个 XML 相似(想忽略 xmlns)和不同的元素序列,但对我来说不能正常工作。如果删除 xmlns,doc 是 simmilr。我正在使用 XMlUnit 1.5 String s1 =
我是一名优秀的程序员,十分优秀!