【问题标题】:How can I compare map-like elements with XMLUnit如何将类似地图的元素与 XMLUnit 进行比较
【发布时间】:2020-01-06 04:37:51
【问题描述】:

我有以下 xml 数据:

控制:

 <Data>

        <propertyValues>
            <propertyName>Name1</propertyName>
            <value>
                <text>
                    <value>Value1</value>
                </text>
            </value>
        </propertyValues>
        <propertyValues>
            <propertyName>Name2</propertyName>
            <value>
                <text>
                    <value>Value2</value>
                </text>
            </value>
        </propertyValues>
 </Data>

测试:

 <Data>
            <propertyValues>
                <propertyName>Name2</propertyName>
                <value>
                    <text>
                        <value>Value2</value>
                    </text>
                </value>
            </propertyValues>
            <propertyValues>
                <propertyName>Name1</propertyName>
                <value>
                    <text>
                        <value>Value1</value>
                    </text>
                </value>
            </propertyValues>
 </Data>

我希望这两个文档是“相同的”。

如何配置 xmlUnit 以使其工作? (我使用的是 xmlunit 2.6.3)

谢谢

里昂

【问题讨论】:

    标签: xmlunit xmlunit-2


    【解决方案1】:

    这与 XMLUnit 用户指南的“选择节点”部分的运行示例非常相似。

    您需要使用ElementSelector 在查看元素列表时选择正确的propertyValues 元素,然后决定比较在唯一名为propertyName 的子元素中包含相同嵌套文本的元素。这直接转化为

    ElementSelectors.conditionalBuilder()
        .whenElementIsNamed("propertyValues")
        .thenUse(ElementSelectors.byXPath("./propertyName", ElementSelectors.byNameAndText))
       ...
    

    然后您需要添加任何其他所需的规则以使其余部分正常工作。查看示例的其余可见部分,没有模棱两可的孩子和简单的

       ...
        .elseUse(ElementSelectors.byName)
        .build();
    

    会的。

    【讨论】:

    • 顺便说一句,您的示例只是拾取了“propertyName”子节点,那么值节点呢?
    • 应该是:.thenUse(ElementSelectors.byXPath("./propertyName|./value/text/value", ElementSelectors.byNameAndText)) ?
    • 它只选择propertyName,因为我认为这是标识需要比较的propertyValues。如果您还需要vaues 以使 XMLUnit 选择正确的对,那么您需要进行调整。这真的只是关于使 XMLUnit 选择正确的 propertyValues - 因为所有其他 byName 被使用并且似乎就足够了。
    • 我刚刚发现我可以使用ElementSelectors.and()来组合propertyName的选择器和value的选择器,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多