当前位置: 首页 > 面试题库 >

比较两个XML字符串,忽略元素顺序

袁凌
2023-03-14
问题内容

假设我有两个xml字符串

<test>
  <elem>a</elem>
  <elem>b</elem>
</test>

<test>
  <elem>b</elem>
  <elem>a</elem>
</test>

如何编写一个比较这两个字符串并忽略元素顺序的测试?

我希望测试尽可能短,没有10行XML解析等的位置。我正在寻找一个简单的断言或类似内容。

我有这个(不起作用)

   Diff diff = XMLUnit.compareXML(expectedString, actualString);   
   XMLAssert.assertXMLEqual("meh", diff, true);

问题答案:

我原来的答案已经过时了。如果必须再次构建它,我将使用xmlunit 2和xmlunit-
matchers。请注意,对于xml单元,不同的顺序始终是“相似”而不是相等。

@Test
public void testXmlUnit() {
    String myControlXML = "<test><elem>a</elem><elem>b</elem></test>";
    String expected = "<test><elem>b</elem><elem>a</elem></test>";
    assertThat(myControlXML, isSimilarTo(expected)
            .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText)));
    //In case you wan't to ignore whitespaces add ignoreWhitespace().normalizeWhitespace()
    assertThat(myControlXML, isSimilarTo(expected)
        .ignoreWhitespace()
        .normalizeWhitespace()
        .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText)));
}

如果有人仍然不想使用纯Java实现,那就是。此实现从xml中提取内容,并比较列表的忽略顺序。

public static Document loadXMLFromString(String xml) throws Exception {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputSource is = new InputSource(new StringReader(xml));
    return builder.parse(is);
}

@Test
public void test() throws Exception {
    Document doc = loadXMLFromString("<test>\n" +
            "  <elem>b</elem>\n" +
            "  <elem>a</elem>\n" +
            "</test>");
    XPathFactory xPathfactory = XPathFactory.newInstance();
    XPath xpath = xPathfactory.newXPath();
    XPathExpression expr = xpath.compile("//test//elem");
    NodeList all = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
    List<String> values = new ArrayList<>();
    if (all != null && all.getLength() > 0) {
        for (int i = 0; i < all.getLength(); i++) {
            values.add(all.item(i).getTextContent());
        }
    }
    Set<String> expected = new HashSet<>(Arrays.asList("a", "b"));
    assertThat("List equality without order",
            values, containsInAnyOrder(expected.toArray()));
}


 类似资料:
  • 我需要比较使用自定义差异侦听器忽略子节点序列和属性列表序列的2个XML: 我的代码适用于: 我找到了一个临时的解决方案(8小时内不能在我自己的问题上添加评论): 我之前用:ElementNameAndAttributeQualifier重写了ElementQualifier,如果我将其更改为RecursiveElementNameAndTextQualifier,我可以得到我想要的结果 还可以使用

  • 问题内容: 我有这样的XML消息: 我想将被测试方法产生的这种类型的消息与预期的消息进行比较,但我不在乎。因此,我希望以上消息被认为等于: 我正在使用XMLUnit的最新版本。 我在想答案是创建一个习惯。如果有准备好要使用的东西,我只是不想重新发明轮子。 欢迎使用XMLUnit以外的库的建议。 问题答案: 自从回答了这个问题以来,XMLUnit发生了很多变化。 现在,您可以在使用时轻松忽略节​​点

  • 问题内容: 问题很简单。JAVA中是否有任何函数可以比较两个字符串并在忽略重音字符的情况下返回true? 即 回报相等。 谢谢 问题答案: 我认为您应该使用Collat​​or类。它允许您设置强度和区域设置,并将适当地比较字符。 从Java 1.6 API中: 您可以设置“整理器”的“强度”属性来确定在比较中被视为重要的差异水平。提供了四个优势:主要,次要,高等教育和同等优势。语言功能的优势确切分

  • 本文向大家介绍在Java中按字典顺序比较两个字符串,包括了在Java中按字典顺序比较两个字符串的使用技巧和注意事项,需要的朋友参考一下 String类的方法。此方法按字典顺序比较两个字符串。比较是基于字符串中每个字符的Unicode值。在字典上比较此String对象表示的字符序列与自变量字符串表示的字符序列。该方法返回 如果当前String对象在字典上在参数字符串之前,则为负整数。 如果当前Str

  • 本文向大家介绍在C#中按字典顺序比较两个字符串,包括了在C#中按字典顺序比较两个字符串的使用技巧和注意事项,需要的朋友参考一下 要比较C#中的字符串,请使用方法。它比较两个字符串并返回以下整数值- 在String.compare()方法中设置两个字符串并进行比较- 示例 您可以尝试运行以下代码以比较C#中的两个字符串。 输出结果

  • 我正在尝试比较这样的字符串: 因为我需要转义通配符,例如 问题: 有没有任何powershell函数可以忽略通配符/regex查找子字符串? 非常感谢。