Diff - Compare 2 xml

hesk

Erfahrenes Mitglied
Hello!

I use the Class Diff to compare two Xml-Files.
Everything works perfect.

But it is possible to set an child-node which gets ignored?

The first xml has 33 nodes.
The second xml has 34 nodes.

I want to set the name of the node somewhere so it get ignored and diff.similar returns true.

Thx
 

Anime-Otaku

Erfahrenes Mitglied
Warum hast du die Frage auf Englisch gestellt? Wie ich in deinen anderen Beiträgen gesehen habe bist du des deutschen mächtig. Außer du bist nicht du oder hast die Frage nur irgendwo herkopiert?

Btw. von welcher Diff Klasse redest du? Mir ist keine Diff-Klasse aus der Standard Java-API bekannt.
 

HonniCilest

Erfahrenes Mitglied
I don't know the Class Diff, but maybe you should search for another keywords/methods.

Think about it, if you have two strings and one of these has more characters than the other one, what would you do? Right, the keywords I mean are e.g. contains or beginnswith.

Good luck furthermore!
 

HonniCilest

Erfahrenes Mitglied
Ok, ich habe mir die Docs mal grob angesehen und spontan würde ich so versuchen:

A) Die Klasse DetailedDiff (erbt von Diff) statt Diff verwenden und mit der Methode getAllDifferences(), welche ein List Objekt zurückgibt, auswerten.

B) Das Event differenceFound überschreiben. Das Event besitzt einen Parameter des Typs "Difference", welcher ausgewertet werden kann.



Direkt eine Möglichkeit zum Ignorieren sehen ich hier nicht, ich denke du bist gezwungen eine eigene Auswertung zu betreiben...
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

schau mal hier:
Java:
package de.tutorials;

import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.Difference;
import org.custommonkey.xmlunit.DifferenceConstants;
import org.custommonkey.xmlunit.DifferenceListener;
import org.custommonkey.xmlunit.XMLUnit;
import org.w3c.dom.Node;

public class XmlDiffExample {

  public static void main(String[] args) throws Exception{

    String xmlA = "<root><elements><e/><e/><e/><e/></elements></root>";
    String xmlB = "<root><elements><e/><e/><bubu/><e/><e/></elements></root>";
    
    final DetailedDiff diff = new DetailedDiff(XMLUnit.compareXML(xmlA, xmlB));
    diff.overrideDifferenceListener(new DifferenceListener() {
      
      @Override
      public void skippedComparison(Node control, Node test) {
        
      }
      
    
      @Override
      public int differenceFound(Difference difference) {
        if(difference.getId() == DifferenceConstants.CHILD_NODELIST_LENGTH_ID
           && difference.getControlNodeDetail().getNode().getNodeName().equals("elements") ){
          return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR;
        }else if(difference.isRecoverable()){
          return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR;
        }else if(difference.getTestNodeDetail().getNode().getNodeName().equals("bubu")){
          return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR; 
        }
        return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
      }
    });
    
    
    //System.out.println(diff);
    
    System.out.println(diff.identical());
    
    System.out.println(diff.similar());
    
    
  }

}

Gruß Tom