代码之家  ›  专栏  ›  技术社区  ›  Hamza Amami

Groovy:将SOAP响应与XML文件进行比较

  •  3
  • Hamza Amami  · 技术社区  · 8 年前

    我想在groovy代码中将Soap响应与xml文件进行比较,忽略顺序:

    这是我的代码:

    import org.custommonkey.xmlunit.Stuff
    import org.xmlunit.Stuff
    
    //ExpectedString is my xml converted to text, same for ResponseString
    
    Diff diff = DiffBuilder.compare(ExpectedString)
               .withTest(ResponseString)
               .ignoreComments()
               .ignoreWhitespace()
               .checkForSimilar()
               .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
               .build();
    
    assertFalse("XML similar " + diff.toString(), diff.hasDifferences())
    

    因此,如您所见,我使用了DefaultNodeMatcher,使用了XMLUnit2.0…但没有结果(即使在比较时没有忽略顺序或出现异常错误)

    有解决办法吗?解决这个问题

    由于我急切地想找到一个直接的方法,我可以对xml和soap响应进行排序,以便进行简单的区分吗?有没有办法按字母顺序逐行排序?如果是,如何?

    谢谢你们!

    下面是我简化的XML结构

    <body>
    <stuff>
      <miniStuff></miniStuff>
      <miniStuff></miniStuff>
    </stuff>
    <Services>
      <Service>
        <tag1>ValueA</tag1>
        <tag2>ValueAA</tag2>
      </Service>
      <Service>
        <tag1>ValueB</tag1>
        <tag2>ValueBB</tag2>
      </Service>
    </services>
    </body>
    

    我的问题是,我不能保证ValueA是第一个,而不是第二个

    1 回复  |  直到 7 年前
        1
  •  6
  •   Rao CrashOverload    8 年前

    下面是您可能正在寻找的:使用 ByNameAndTextRecSelector

    withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
    

    单元测试:

        @Test
        public void testDiffOrder() {
            final String control = """
                <r>
                    <ser>
                        <t1>a</t1>
                        <t2>b</t2>
                    </ser>
                    <ser>
                        <t1>d</t1>
                        <t2>e</t2>
                    </ser>
                </r>"""
            final String test = """
                <r>
                    <ser>
                        <t1>d</t1>
                        <t2>e</t2>
                    </ser>
                    <ser>
                        <t1>a</t1>
                        <t2>b</t2>
                    </ser>
                </r>"""
            Diff diff = DiffBuilder.compare(Input.fromString(control))
                    .withTest(Input.fromString(test))
                    .ignoreComments()
                    .ignoreWhitespace()
                    .checkForSimilar()
                    .withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
                    .build()
    
            assertFalse("XML differ " + diff.toString(), diff.hasDifferences())
        }
    

    归功于@bodewig。 样品 here

    使用OPs原始xml片段。

    import org.xmlunit.builder.DiffBuilder
    import org.xmlunit.builder.Input
    import org.xmlunit.diff.ByNameAndTextRecSelector
    import org.xmlunit.diff.DefaultNodeMatcher
    import org.xmlunit.diff.ElementSelectors
    
    def control = """<body>
       <stuff>
          <miniStuff />
          <miniStuff />
       </stuff>
       <Services>
          <Service>
             <tag1>ValueB</tag1>
             <tag2>ValueBB</tag2>
          </Service>
          <Service>
             <tag1>ValueA</tag1>
             <tag2>ValueAA</tag2>
          </Service>
       </Services>
    </body>"""
    def test = """<body>
       <stuff>
          <miniStuff />
          <miniStuff />
       </stuff>
       <Services>
          <Service>
             <tag1>ValueA</tag1>
             <tag2>ValueAA</tag2>
          </Service>
          <Service>
             <tag1>ValueB</tag1>
             <tag2>ValueBB</tag2>
          </Service>
       </Services>
    </body>"""
    def myDiff = DiffBuilder.compare(Input.fromString(control))
                .withTest(Input.fromString(test))
                .checkForSimilar()
                .withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
                .build()
    println myDiff.toString()
    println myDiff.hasDifferences()
    assert !myDiff.hasDifferences()
    
    推荐文章