# XML-Vergleich unter JDOM



## taouri (2. Januar 2007)

Hallo zusammen, ich habe das folgende Problem bei der (im Forum bereits angesprochenen) Problemstellung zwei XML-Dateien zu vergleichen: 

Ich habe ein Programm geschrieben, das die beiden XML-Files (wobei jedes Element ein Attribut names treeName haben muss, welches das Element identifiziert) und entweder true für identisch, oder false für unterschiedlich zurückgibt. Das Problem ist nur, dass wenn bei den Elementattributen ein Unterschied (sogar nur in der Anzahl) vorliegt, dieser nicht registriert wird.

Hier mein Code:


```
public static boolean testForEquality(String oldFile, String newFile)
    throws JDOMException, IOException
  {
    SAXBuilder builder = new SAXBuilder();
    
    Document oldXML = builder.build(oldFile);
    Document newXML = builder.build(newFile);
    
    Element oldRoot = oldXML.getRootElement();
    Element newRoot = newXML.getRootElement();
    
    return testRecursive(oldRoot, newRoot);
  }
  
  private static boolean testRecursive(Element oldElement, Element newElement)
  {
    if(oldElement.getChildren().size() != newElement.getChildren().size())
    {
      System.out.println("Differenz bei Anzahl Kinder");
      return false;
    }
    
    if(!oldElement.getName().equals(newElement.getName()))
    {
      System.out.println("Differenz bei Name");
      return false;
    }
    
    if(!oldElement.getText().equals(newElement.getText()))
    {
      System.out.println("Differenz bei Inhalt");
      return false;
    }
    
    List oldAttributes = oldElement.getAttributes();
    List newAttributes = newElement.getAttributes();
    
    if(oldAttributes.size() != newAttributes.size())
    {
      System.out.println("Differenz bei Anzahl Attribute");
      return false;
    }
    
    Iterator<Attribute> oldAttributesIterator = oldAttributes.iterator();
    
    while(oldAttributesIterator.hasNext())
    {
      Attribute a = oldAttributesIterator.next();
      
      String oldValue = a.getValue();
      String newValue = newElement.getAttributeValue(a.getName());
      
      if(!oldValue.equals(newValue))
      {
        System.out.println("Differenz bei Attributinhalt");
        return false;
      }
    }
    
    List<Element> children = oldElement.getChildren();
    Iterator<Element> childrenIterator = children.iterator();
    
    while(childrenIterator.hasNext())
    {
      Element oldChild = childrenIterator.next();
      
      Element newChild = null;
      
      List<Element> newChildren = newElement.getChildren();
      Iterator<Element> newChildrenIterator = newChildren.iterator();
      
      while(newChildrenIterator.hasNext())
      {
        Element currentChild = newChildrenIterator.next();
        
        if(currentChild.getAttributeValue("treeName").equals(oldChild.getAttributeValue("treeName")))
        {
          newChild = currentChild;
        }
      }
      
      System.out.println("in Schleife gelangt");
      
      if(!testRecursive(oldChild, newChild))
      {
        return false;
      }
    }
    
    return true;
  }
```

Kann mir jemand helfen?

Gruß

taouri


----------



## KlaDi (3. Januar 2007)

Kann es sein, das schon bevor die Elementattribute abgefragt werden, eine Differenz zwischen Deinen XML-Dateien vorliegt und dadurch Dein Funktion abgebrochen wird? Ansonsten wüßte ich jetzt nach einem kurzen drüberschauen nicht wo das Problem liegt.

Gruß.


----------



## Thomas Darimont (3. Januar 2007)

Hallo!

Warum immer alles von Hand machen?....
http://www.tutorials.de/forum/java/...nte-testen-mit-xmlunit.html?highlight=XmlUnit

Gruß Tom


----------



## taouri (3. Januar 2007)

Puh, das sieht ziemlich kompliziert aus, so auf den ersten Blick. Werd mich mal rein vertiefen. Danke.

Gruß

taouri


----------



## taouri (6. Februar 2007)

Sorry, dass ich den Thread nochmal aufnehme, aber ich hätte noch eine Frage zu XMLUnit: Und zwar würde mich interessieren, ob XMLUnit auch für kommerzielle Zwecke frei ist.

Danke im Voraus

taouri


----------

