代码之家  ›  专栏  ›  技术社区  ›  Paul Morie

在比较XML时,如何忽略某些元素?

  •  41
  • Paul Morie  · 技术社区  · 16 年前

    我有一条这样的XML消息:

    <root>
      <elementA>something</elementA>
      <elementB>something else</elementB>
      <elementC>yet another thing</elementC>
    </root>
    

    elementA

    <root>
      <elementA>something different</elementA>
      <elementB>something else</elementB>
      <elementC>yet another thing</elementC>
    </root>
    

    XMLUnit .

    DifferenceListener

    5 回复  |  直到 8 年前
        1
  •  14
  •   Jean-François Savard    10 年前

    我最终实施了一个 DifferenceListener 这需要一个节点名称列表(带命名空间)来忽略以下内容的文本差异:

    public class IgnoreNamedElementsDifferenceListener implements DifferenceListener {
        private Set<String> blackList = new HashSet<String>();
    
        public IgnoreNamedElementsDifferenceListener(String ... elementNames) {
            for (String name : elementNames) {
                blackList.add(name);
            }
        }
    
        public int differenceFound(Difference difference) {
            if (difference.getId() == DifferenceConstants.TEXT_VALUE_ID) {
                if (blackList.contains(difference.getControlNodeDetail().getNode().getParentNode().getNodeName())) {
                    return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
                }
            }
    
            return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
        }
    
        public void skippedComparison(Node node, Node node1) {
    
        }
    }
    
        2
  •  38
  •   Paul Morie    16 年前

    事情已经发生了很大的变化 XMLUnit 因为这个问题得到了回答。

    现在,您可以在使用时轻松忽略节点 DiffBuilder :

    final Diff documentDiff = DiffBuilder
                .compare(expectedSource)
                .withTest(actualSource)
                .withNodeFilter(node -> !node.getNodeName().equals(someName))
                .build();
    

    documentDiff.hasDifferences()

        3
  •  8
  •   Community Mohan Dere    9 年前

    identity transform 过滤掉我想忽略的元素,并比较结果。

    XSL: how to copy a tree, but removing some nodes ?

        4
  •  0
  •   Zheng Wang    8 年前

    您现在可以尝试 ${xmlunit.ignore}

    Diff diff = DiffBuilder
        .compare(expectedXML)
        .withTest(actualXML)
        .withDifferenceEvaluator(new PlaceholderDifferenceEvaluator())
        .build();
    

    <root>
      <elementA>${xmlunit.ignore}</elementA>
      <elementB>something else</elementB>
      <elementC>yet another thing</elementC>
    </root>
    

    实际XML:

    <root>
      <elementA>anything</elementA>
      <elementB>something else</elementB>
      <elementC>yet another thing</elementC>
    </root>
    

    请注意,目前${xmlunit.ignore}只支持文本节点和属性值忽略,从 unit tests .

        5
  •  -1
  •   Vishal Chhodwani    8 年前

    忽略节点 不管你想忽略多少节点的长度,或者你不知道 ,按照以下简单步骤操作

    public static void XMLdiff(String XML1, String XML2){
                   
     //nodes you wanted to ignore
            String[] ignoreNodes = {"nodeX", "nodeY", "nodeZ"};
          
    //testnode(node,ignoreNodes) is handled below for finding and ignoring multiple nodes
            final Diff documentDiff = DiffBuilder.compare(XML1)
                                      .withTest(XML2)
                                      .withNodeFilter(node->testnode(node,ignoreNodes))
                                      .build();
    }
    
    private static boolean testnode(Node node, String[] name) {
    
            for (int i = 0; i < name.length; i++) {
    
                if (node.getNodeName().toString().equals(name[i])) {
                    return false;
                }
                if (name.length == 0) {
                    break;
                }
            }
            return true;
        }
    

    https://www.xmlunit.org/