FAQ

Übersicht

  1. Basissteuerungs-Datei
    1. Was ist die Basissteuerungs-Datei?
    2. Wie kann ich eine Basissteuerungs-Datei generieren?
    3. Ist es nötig, die Basissteuerungs-Datei zu ändern?
    4. Was sind identifizierende Elemente oder Attribute?
    5. Warum benötigt man identifizierende Elemente/Attribute?
    6. Wie kann ich identifizierende Elemente/Attribute definieren?
    7. Was ist ein Satz bei Xml-Daten?
    8. Kann ich meine eigenen Konvertierungsfunktionen schreiben?
    9. Kann ich Elemente/Attribute als unerlaubt konfigurieren?
    10. Wie kann ich white-space erhalten?
  2. Vergleichen von Xml-Daten
    1. Wie kann ich einen Vergleich von zwei Xml-Dateien ausführen?
    2. Wo definiere ich die Vergleichsregeln?
    3. Wie kann ich nicht-identifizierende Elemente vergleichen?
    4. Wie kann ich Elemente vom Vergleich ausschließen?
    5. Wie kann ich Elemente vergleichen, die anders sortiert sind?
    6. Welche Unterschiede zw. Xml-Dateien können entdeckt werden?
    7. Wenn identifizierende Elemente/Attribute nicht paarig sind?
    8. Mehr als ein Satz mit gleichen identifizierenden Elementen?
    9. Konsequenzen, wenn ein Element identifizierend ist?
    10. Wie kann ich verschieden sortierte Sätze vergleichen?
    11. Wie kann ich verschieden formatierte Daten vergleichen?
    12. Wie kann ich ein Element vor dem Vergleichen konvertieren?
    13. Kind-Element identifizierend fü höher stehenden Satz
    14. Kann ich Vergleich stoppen, wenn X Differenzen erkannt wurde?
    15. Was sind die Ergebnisse eines Vergleiches?
    16. Was ist der Inhalt der Fehler-Datei?
    17. Was ist der Inhalt der Statistik-Datei?
    18. Wie erzeuge ich eine Html-Ausgabe?
    19. Wie erzeuge ich Xml-Ausgabe, in welcher Differenzen im Context ausgegeben werden?
    20. Wie erzeuge ich Pdf-Ausgabe, in welcher Differenzen im Context ausgegeben werden?
  3. Mischen von Xml-Daten
    1. Wie führe ich das Mischen von zwei Xml-Dateien aus?
    2. Wo kann ich die Mischregeln konfigurieren?
    3. Wie kann ich eine Mischsteuerungs-Datei generieren?
  4. Umgruppieren von Xml-Daten
    1. Wie führe ich das Umgruppieren von Xml-Daten aus?
    2. Wo kann ich die Umgruppierungsregeln konfigurieren?
    3. Wie kann ich eine Umgrupierungssteuerungs-Datei generieren?
  5. Sortieren von Xml-Daten
    1. Wie führe ich das Sortieren von Xml-Daten aus?
    2. Wo kann ich die Sortierregeln konfigurieren?
    3. Wie kann ich eine Sortiersteuerungs-Datei generieren?
  6. Performance
    1. Kann ich große Dateien vergleichen?
    2. Hauptspeicherbedarf beim Vergleichen großer Dateien?
    3. Plattenplatzbedarf?
    4. Parameter mit großen Einfluß auf die Performance?
  7. Verschiedenes
    1. Ist <xml>cmp gegeignet für Regressionstests?
    2. Werden Beispiele ausgliefert mit der <xml>cmp-Software?
    3. Werden Xml-Namespaces unterstützt?
    4. Kann ich unterschiedliche Sax-Parser verwenden?
    5. Xml-Daten vergleichen, die keine DTD oder Schema haben?
    6. Spezielle Software- oder Hardware-Anforderungen?
    7. Gründe für "java.lang.Unsupported ClassVersionError" ?

1. Basissteuerungs-Datei

1.1. Was ist die Basissteuerungs-Datei?

Die Basisregeln für die Verarbeitung von Xml-Daten werden in der Basissteuerungs-Datei definiert. Beispiele für solche Regeln:

  • Welche Elemente/Attribute sind identifizierend.
  • Soll der Inhalt eines Elementes/Attributes vor der weiteren Verarbeitung konvertiert werden.
  • Soll ein Element/Attribut nicht verarbeitet werden.
Für das Vergleichen, Mischen, Konvertieren und Sortieren wird immer eine Basissteuerungs-Datei benötigt.
Alle Regeln für das Vergleichen werden ebenfalls in der Basissteuerungs-Datei definiert.
Für das Mischen, Konvertieren oder Sortieren von Xml-Daten benötigt man eine zusätzliche Mischsteuerungs-, Konvertierungssteuerungs- oder Sortierungssteuerungs-Datei.

1.2. Wie kann ich eine Basissteuerungs-Datei generieren?

Die Prozedur "xmlcmpcreate.sh" kann eine Basisisteuerungs-Datei für eine bestimmte Xml-Datei generieren.: Example: Generieren der Basiskontroll-Datei "cmp.xml" für xml-file "test.xml".

Beispiel:
$ xmlcmpcreate.sh test.xml > cmp.xml

1.3. Ist es nötig, die Basissteuerungs-Datei zu ändern?

Nein, grundsätzlich ist dies nicht erforderlich.
Ein Vergleich von Xml-Daten würde genauso akurrat durchgeführt werden können und er würde genauso alle Differenzen erkennen, auch wenn die Basissteuerungs-Datei nicht modifiziert worden ist.
Aber: Wenn Sie Einfluß haben wollen - zum Beispiel auf die Vergleichsregeln -, dann müssen Sie die Basisteuerungs-Datei anpassen.
Zum Beispiel um zu definieren, daß

  • Elemente nicht verglichen werden sollen,
  • Inhalte vor dem Vergleich konvertiert werden sollen,
  • die Reihenfolge der Sätze gleich sein soll

In diesen Fällen müssen Sie die Basissteuerungs-Datei anpassen.

1.4. Was sind identifizierende Elemente oder Attribute?

Elemente sind identifizierend, wenn ihr Inhalt identifizierend ist für das Eltern-Element (auch Satz genannt).

Attribute sind identifizierende, wenn ihr Inhalt identifizierend ist für das aktuelle Element, zu dem das Attribut gehört.

Beispiel 1:
<list_person>
    <person>
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <birthdate>1999-10-04</birthdate>
        <profession>carpenter</profession>
    </person>
    <person>
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <birthdate>2000-10-04</birthdate>
        <profession>butcher</profession>
    </person>
</list_person>

Eine "<person>" wird identifziert durch den Inhalt der Elemente "<name>", "<firstname>" und "<birthdate>".

Beispiel 2:
<list_person>
    <person id="1">
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <birthdate>1999-10-04</birthdate>
        <profession>carpenter</profession>
    </person>
    <person id="2">
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <birthdate>2000-10-04</birthdate>
        <profession>butcher</profession>
    </person>
</list_person>

Eine "<person>" wird identifiziert durch den Inhalt des Attributes "id".

1.5. Warum benötigt man identifizierende Elemente/Attribute?

Identifizierende Elemente/Attribute werden benötigt, um zu entscheiden, welche Elemente (=Sätze) miteinander verglichen oder gemischt werden sollen. Zum Beispiel: Nur Sätze, welche die gleichen identifizierenden Inhalte haben, werden miteinander verglichen.

1.6. Wie kann ich identifizierende Elemente/Attribute definieren?

Elemente werden als identifizierende Elemente deklariert durch das Attribut "ident_text" in der Basissteuerungs-Datei .

Beispiel 1:
Die Elemente "<name>, "<firstname>" und "<birthdate>" sind identifizierend für Element "<person>".

Beispiel 1:
<list_person>
    <person>
        <name ident_text="true" />
        <firstname ident_text="true" />>

        <birthdate ident_text="true" /> >
        <profession ident_text="false" />
    </person>
</list_person>

Attribute werden als identifizierend markiert über das Attribut "ident_att_" in der Basissteuerungs-Datei.

Beispiel 2:
Das Attribut "id" von Element "" ist identifizierend für Element "".

Beispiel 2:
<list_person>
    <person ident_att_id="true">
    </person>
</list_person>

Wenn man eine Basissteuerungs-Datei über die Shellprozedur "xmlcmpcreate.sh" generiert, sind per default alle Elemente und Attribute identifizierend.

Empfehlung:
Entscheiden Sie welche Elemente und Attribute wirklich "identifizierend" sind und passen Sie demgemäß die Basissteuerungs-Datei an. Zu viele identifizierende Elemente erhöhen des Plattenplatzbedarf und drücken negativ auf die Performance, wenn es sich um hierarchisch geschachtelte Sätze handelt mit vielen identifizierenden Attributen/Elementen auf jeder Hierarchieebene.

1.7. Was ist ein Satz bei Xml-Daten?

Ein Satz ist ein Element, welches Kind-Elemente hat, und/oder welches Attribute hat. Der Inhalt von allen Kind-Elementen und Attribute gehören zu dem Satz.

Ein Satz hat identifizierende Elemente und/oder Attribute.

Beispiel 1:
Im folgendem Beispiel gibt es zwei Personen-Sätze. Jeder Satz wird identifiziert durch das Attribut "id".
<list_person>
    <person id="1">
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <birthdate>1999-10-04</birthdate>
        <profession>carpenter</profession>
    </person>
    <person id="2">
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <birthdate>2000-10-04</birthdate>
        <profession>butcher</profession>
    </person>
</list_person>
Basissteuerungs-Datei:
<list_person>
    <person ident_att_id="true">
             ..
    </person>
</list_person>
Beispiel 2:
Das folgende Beispiel erweitert das vorhergehende Beispiel 1.
Jeder Personen-Satz hat nun einen Kind-Adress-Satz.
<list_person>
    <person id="1">
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <birthdate>1999-10-04</birthdate>
        <profession>carpenter</profession>
            <address>
            <town>New York</town>
            <street>Westminster</street>
            <houseno>1</houseno>
        </address>
    </person>
    <person id="2">
        <name>Smith</name>
        <firstname>Peter</firstname>
        <birthdate>2000-10-04</birthdate>
        <profession>butcher</profession>
            <address>
            <town>Washington</town>
            <street>Bakerstreet</street>
            <houseno>121</houseno>
        </address>
    </person>
</list_person>
Basissteuerungs-Datei:
<list_person>
    <person ident_att_id="true">
            ..
                <address>
                    <town ident_text="true"/>
                    <street ident_text="true"/>
                    <houseno ident_text="true"/>
                </address>
            ..
    </person>
</list_person>

Ein Adress-Satz wird identifiziert durch Attribut "id" von Element "<person>" und durch die Elemente "<town>", "<street>" und "<houseno>"

1.8. Kann ich meine eigenen Konvertierungsfunktionen schreiben?

Ja. Sie können.
Ihre eigenen Konvertierungsfunktionen müssen in Java geschrieben sein, und diese müssen das Java-Interface "de.sofika.test.ConvertInterface" implementiert haben.

1.9. Kann ich Elemente/Attribute als unerlaubt konfigurieren?

Ja.
Wenn die Shellvariable "isOtherForbidden" den Wert "true" hat, dann wird eine Fehlermeldung ausgegeben für jedes Element/Attribut in dem Xml-File, welches nicht in der Basissteuerungsdatei aufgeführt ist.

1.10. Wie kann ich white-space erhalten?

Per default bleibt white-space in Elementen oder Attribute erhalten.

White-space wird entfernt für alle Elemente und Attribute, wenn die Shellvariable "isTrimAll" den Wert "true" hat.

Wenn Sie nur bei bestimmten Elementen oder Attribute den white-space entfernen wollen, können Sie dies indem Sie den Inhalt mit Hilfe der ausgelieferten Java-Klasse "de.sofika.test.ConvertTrim" konvertieren.

2. Vergleichen von Xml-Daten

2.1. Wie kann ich einen Vergleich von zwei Xml-Dateien ausführen?

Durch Ausführen der Shellprozedur "xmlcmp.sh"

Syntax:
$ xmlcmp.sh <basic-control-file.xml> <file1.xml> <file2.xml>
Beispiel:
$ xmlcmp.sh cmp1.xml test1a.xml test1b.xml

2.2. Wo definiere ich die Vergleichsregeln?

Die Vergleichsregeln müssen in der Basissteuerungs-Datei konfigurert werden.
Die Basissteuerungs-Datei ist ebenfalls eine Xml-Datei.

2.3. Wie kann ich nicht-identifizierende Elemente vergleichen?

Nicht-identifizierende Elemente oder Attribute werden verglichen, wenn das Attribute "cmp_text" bzw. "cmp_att_<attribute>" den Wert "true" hat.

Basissteuerungs-Datei:
<list_person>
    <person ident_att_id="true">
        <name cmp_text="true" />
        <firstname cmp_text="true" />
        <birthdate cmp_text="true" />
    </person>
</list_person>

2.4. Wie kann ich Elemente vom Vergleich ausschließen?

Elemente oder Attribute werden nicht verglichen, wenn Sie sich nicht in der Basissteuerungsdatei befinden, oder wenn Attribut cmp_text/cmp_att_<attribute> den Wert "false" hat.

Im folgendem Beispiel wird der Inhalt von "<birthdate>" nicht verglichen:

Basisteuerungs-Datei:
<list_person>
    <person ident_att_id="true">
        <name cmp_text="true" />
        <firstname cmp_text="true" />
        <birthdate cmp_text="false" />
    </person>
</list_person>

2.5. Wie kann ich Elemente vergleichen, die anders sortiert sind?

Per default spielt die Reihenfolge von Elementen keine Rolle für den Vergleich. iÜber das Attribut element_sequence="true" kann man festlegen, daß die Reihenfolge der Elemente verglichen wird.

Beispiel: Basissteuerungs-Datei:
<list_person>
    <person ident_att_id="true"
            element_sequence="true">

        <name      cmp_text="true" />
        <firstname cmp_text="true" />
        <birthdate cmp_text="true" />
    </person>
</list_person>

Wenn die Elemente "<name>", "<firstname>" und "<birthdate>" nicht in der gleichen Reihenfolge angeordnet sind, wird eine Fehlermeldung ausgegeben.

2.6. Welche Unterschiede zwischen Xml-Dateien können entdeckt werden?

Alle Differenzen können ermittelt werden.
Differenzen können folgende Fehlermeldungen bewirken:
Fehler-
nummer
Fehlermeldung
E0011Content of element '<element>' is different.
E0012Input[1|2] is missing element '<element>'
E0013Tag '<element>' of input[1|2] is not allowed.
E0021Content of attribute '<attribute>' is different.
E0022Input[1|2] is missing attribute '<attribute>'
E0023Attribute '<attribute>'of input[1|2] is not allowed.
E0032Identity-path '<path>' of input[1|2] is missing in input[1|2].
E0034Detail-elements of identity-path '<path>' have different sequence.
E0035Row-sequence in identity-path '<path>' is different.
E0036Count of rows with same identity-path '<path>' is different.
E0037There are rows with same identity '<path>' but <y> of these rows have different content, for example in element '<element>'

2.7. Wenn identifizierende Elemente/Attribute nicht paarig sind?

Wenn es keine paarigen identifizierenden Elemente/Attribute zu einem Satz gibt, wird eine Fehlermeldung ausgegeben.
Beispiel:

Basissteuerungs-Datei:
<list_person>
    <person ident_att_id="true">
    </person>
</list_person>
Datei 1:
<list_person>
    <person id="1">
    </person>
        <person id="2">
        </person>
        <person id="3">
        </person>
</list_person>
Datei 2:
<list_person>
    <person id="1">
    </person>
</list_person>

In Datei2 gibt es Personen mit "id" "2" or "3". Die folgenden Fehlermeldungen werden ausgegeben für die id's id="2" und "3":

identity-path '/list/person" of input1 is missing in input2

1.8. Mehr als ein Satz mit gleichen identifizierenden Elementen ?

Das ist kein Problem.
Identifizierende Elemente/Attribute müssen nicht einen eindeutigen Primäschlüssel darstellen. Aber: Sie sollten die identifizierenden Elemente/Attribute so wählen, daß sie möglichst genau einen Satz identifizieren. Aus Performancegründen ist die ideale Situation, wenn der Inhalt der identifizierenden Elemente/Attribute immer genau ein Satz identifizieren.

Beispiel:
Eine Person wird identifiziert durch "<name>":

Basic-control-file:
<list_person>
    <person>
        <name ident_text="true" />
        <profession cmp_text="true" />
    </person>
</list_person>
File1:
Es gibt 3 Personen mit dem gleichen Namen "Fischer", und mit jeweils 3 verschiedenen Berufen.
<list_person>
    <person>
        <name>Fischer</name>
        <profession>carpenter</profession>
    </person>
    <person>
        <name>Fischer</name>
        <profession>butcher</profession>
    </person>
    <person>
        <name>Fischer</name>
        <profession>baker</profession>
    </person>
</list_person>
Datei2:
Es gibt wieder 3 Personen mit dem gleichen Namen "Fischer", aber zwei von ihnen haben den gleiche Beruf, wie in Datei1 und Personen haben eine andere Reihenfolge.
<list_person>
    <person>
        <name>Fischer</name>
        <profession>baker</profession>
    </person>
    <person>
        <name>Fischer</name>
        <profession>teacher</profession>
    </person>
    <person>
        <name>Fischer</name>
        <profession>butcher</profession>
    </person>
</list_person>

Der Vergleich wird folgende Fehlermeldungen erzeugen:

 
E0037 there are rows with same identity '/list_person/person' but 1 of these rows have different content, for example in element '/list_person/person/profession'.

2.9. Konsequenzen, wenn Element identifizierend ist?

Wenn man ein Element oder Attribut als identifizierend definiert, hat das Auswirkungen auf die Art der Fehlermeldung, die man erhält, wenn dieses Element oder Attribut unterschiedlichen Inhalt in den beiden Xml-Dateien hat.

Beispiel:
In beiden Dateien gibt es eine Person mit <name> "Fischer", aber in einer Datei mit <residence> "New York" und in der anderen mit "Washington".

Wenn beide Elemente <name> und <person> als identifzierend deklariert sind, wird man folgende beiden Fehlermeldungen erhalten:

 
E0032 identity-path <person> of input1 is missing in input2.
E0032 identity-path <person> of input2 is missing in input1.

Wenn nur Element <name> identifizierend ist, wird man folgende Fehlermeldung bekommen.

 
E0011 content of element '/person/residence' is different'.

2.10. Wie kann ich verschieden sortierte Sätze vergleichen?

Per default spielt die Reihenfolge von Sätzen keine Rolle beim Vergleichen. Über Attribut "row_sequence=true" kann man definieren, daß die Reihenfolge der Sätze in beiden Dateien gleich sein muß.

2.11. Wie kann ich verschieden formatierte Daten vergleichen?

In der Basissteuerungs-Datei kann man angeben, daß die unterschiedlich formatierten Inhalte in ein einheitliches Format vor Durchführung des Vergleichs konvertiert werden.

2.12. Wie kann ich ein Element vor dem Vergleichen konvertieren?

Man kann den Inhalt eines Elements/Attributs über die speziellen "convert"-Attribute der Basissteuerungs-Datei konvertieren.

Beispiel:
Element "<birthdate>" ist unterschiedlich formatiert. In Datei1 zum Beispiel hat es den Wert "2005-01-01" und in Datei2 den Wert "2005.01.01". Die Java-Konvertierungsklasse "de.sofika.test.ConvertDate" konvertiert die unterschiedlich formatierten Datumsangaben in eine einheitliches vergleichbares Format.

Basisteuerungs-Datei:
<list_person>
    <person>
        <name      ident_text="true" \>
        <firstname ident_text="true"\>
        <birthdate cmp_text="true"
            conv_text1_class="de.sofika.test.ConvertDate"
            conv_test2_class="de.sofika.test.ConvertDate"
            conv_text1_in="YYYY-MM-DD"
            conv_text2_in="YYYY.MM.DD"
            conv_text1_out="YYYYMMDD"
            conv_text2_out="YYYYMMDD"
                \>

    </person>
</list_person>

Mit <xml>cmp werden folgende Java-Konvertierungsklassen ausgeliefert:

Java-KonvertierungsklasseKonvertierfunktion
de.sofika.test.ConvertDateKonvertierung von Datumsangaben
de.sofika.test.ConvertNumberKonvertierung von Zahlen
de.sofika.test.ConvertTrim()String.trim()-Funktion
de.sofika.test.ConvertSortedStrings()Wenn ein Element/Attribut aus verschiedenen Strings besteht, dann werden diese sortiert.

2.13. Kind-Element identifizierend für höher stehenden Satz.

Das ist ein häufiges und typisches Problem, wenn man Xml-Daten miteinander vergleicht.

Zum Beispiel: Eine Person wird nicht alleine durch person-name und person-firstname identifiziert. Eine Person benötigt die Adresse für die Identifizierung.

Im folgenden Beispiel haben zwei Personen jeweils den gleichen Namen, aber unterschiedliche Adressen und Berufe:

Datei1:
<list_person>
    <person>
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <profession>butcher</profession>
            <address>
                <town>New York</town>
                <street>Westminster</street>
                <houseno>1</houseno>
            </address>
    </person>
</list_person>
Datei2:
<list_person>
    <person>
        <name>Fischer</name>
        <firstname>Hans</firstname>
        <profession>baker</profession>
            <address>
                <town>Munich</town>
                <street>Verdistr.</street>
                <houseno>10</houseno>
            </address>
    </person>
</list_person>

Das <address>-Element hat das Attribut "ident_master=true". Das bewirkt, daß alle identifizierenden Elemente des Address-Satz (<town>,<street>, <houseno>) auch identifizierend sind für den Person-Satz.

Basissteuerungs-Datei:
<list_person>
    <person>
        <name ident_text="true" \>
        <firstname ident_text="true"\>
        <profession cmp_text="true"\>
        <address ident_master="true">
            <town ident_text="true"/>
            <street ident_text="true"/>
            <houseno ident_text="true"/>
            </address>
            ..
    </person>
</list_person>

Wenn die zwei Dateien miteinander verglichen werden, erscheinen folgenden Fehlermeldungen:

 
E0032 identity-path '/list_person/person' of input1 is missing in input2
E0032 identity-path '/list_person/person' of input2 is missing in input1

Beachte:
Ohne Attribut "ident_master=true" würden folgende "falschen" Fehlermeldungen ausgegegeben:

 
E0032 identity-path '/list_person/person/address' of input1 is missing in input2
identity-path '/list_person/person/address' of input2 is missing in input1
E0011 content of element '/list_person/person/profession" is different

2.14. Kann ich Vergleich stoppen, wenn X Differenzen erkannt wurde?

Ja, Sie können.
Per default werden sämtliche Differenzen ermittelt. Über die Shellvariable "isStopIfErrorCount" kann man die maximale Anzahl der ermittelten Diffferenzen begrenzen. Das kann die Performance verbessern.

2.15. Was sind die Ergebnisse eines Vergleiches?

<xml>cmp liefert folgende Ergebnisse:

  • Exit-Code
  • Fehlermeldungs-Datei
  • Statistik-Datei

2.16. Was ist der Inhalt der Fehler-Datei?

Die Fehlermeldungsdatei ist ebenso eine Xml-Datei.
In der Error-Datei werden alle gefunden Fehlermeldungen (=gefundene Differenzen) abgelegt.
Die Fehlermeldungen werden guppiert abgelegt nach Fehlermeldungstext.

Jeder Fehler-Satz hat ein "<xmlcmp:ident>"-Element. In diesem Element werden die identifizierenden Werte des Satzes, bei dem die Abweichung gefunden wurde, aufgelistet.

In dem "<xmlcmp:input1> bzw. <xmlcmp:input2>-Element werden die nicht-identifizierenden Elemente/Attribute des betroffenen Satzes ausgegeben.

 
<?xml version='1.0' encoding='UTF-8'?>
<xmlcmp:errors xmlns:xmlcmp='http://www.xmlcmp.org/cmpresult'>
    <xmlcmp:error xmlcmp:text="E0032 identity-path '/delivery/list_person/person' of input1 is missing in input2."xmlcmp:count="2" >
        <xmlcmp:row xmlcmp:number="1">
            <xmlcmp:ident>
                <delivery>
                    <list_person>
                        <person id="588520"></person>
                    </list_person>
                </delivery>
            </xmlcmp:ident>
            <xmlcmp:input1 xmlcmp:name="test59a.xml" xmlcmp:xml_line="4" xmlcmp:xml_col="23">
            <xmlcmp:elements><person><name>Fischer</name><firstname>Hans</firstname></person></xmlcmp:elements>
        </xmlcmp:input1>
        </xmlcmp:row>
        <xmlcmp:row xmlcmp:number="2">
            <xmlcmp:ident>
                <delivery>
                    <list_person>
                        <person id="588521"></person>
                    </list_person>
                </delivery>
            </xmlcmp:ident>
            <xmlcmp:input1 xmlcmp:name="test59a.xml" xmlcmp:xml_line="9" xmlcmp:xml_col="23">
                <xmlcmp:elements><person><name>Becker</name><firstname>Claudia</firstname></person></xmlcmp:elements>
            </xmlcmp:input1>
        </xmlcmp:row>
    </xmlcmp:error>
</xmlcmp:errors>

2.17. What is ist der Inhalt der Statistik-Datei?

Die Statistik-Datei ist ebenso eine Xml-Datei.
In der Statistik-Datei werden alle Parameter und statistischen Informationen des Vergleichs protokolliert. Zum Beispiel: Wie viele Abweichungen gefunden wurden, welche Abweichungen wie oft, wie viel Zeit der Vergleich beansprucht hat und so weiter

Beispiel:
<?xml version='1.0' encoding='UTF-8'?>
<xmlcmp:xml_compare_result xmlns:xmlcmp='http://www.xmlcmp.org/cmpresult'>
    <xmlcmp:input1 xmlcmp:name="test1a.xml" xmlcmp:bytes="960" xmlcmp:mbytes="0"/>
    <xmlcmp:input2 xmlcmp:name="test1b.xml" xmlcmp:bytes="960" xmlcmp:mbytes="0"/>
    <xmlcmp:tmpspace xmlcmp:bytes="2466" xmlcmp:mbytes="0"/>
    <xmlcmp:error_filename>test1a.xml-err.xml</xmlcmp:error_filename>
    <xmlcmp:stat_filename>test1a.xml-stat.xml</xmlcmp:stat_filename>
    <xmlcmp:compare_filename>cmp2.xml</xmlcmp:compare_filename>
    <xmlcmp:parameter isStopIfErrorCount="0" isOtherForbidden="false" trimAll="false" />
    <xmlcmp:time sec="1" conv_sec="1" sort_sec="0" cmp_sec="0"/>
    <xmlcmp:error_count>1</error_count>
    <xmlcmp:errors>
        <xmlcmp:error text="Identity-path '/delivery/list_person/person' of input1 is missing in '." count="1">
    <xmlcmp:errors>
</xmlcmp:xml_compare_result>

2.18. Wie erzeuge ich eine Html-Ausgabe?

Wenn Shellvariable "htmlDir" gesetzt ist, dann wird die Fehlermeldungsdatei nach Html konvertiert.

2.19. Wie erzeuge ich Xml-Ausgabe, in welcher Differenzen im Context ausgegeben werden?

Wenn Shellvariable "isMerge" den Wert "true" hat, dann wird eine Xml-Datei erzeugt, welche alle Daten der Datei 1 und der Datei 2 sowie die Differenzen enthält.

Wenn Shellvariable "isMergeOnlyDiff" den Wert "true" hat, dann wird eine Xml-Datei erzeugt, welche nur die Differenzen enthält.

2.20. Wie erzeuge ich Pdf-Ausgabe, in welcher Differenzen im Context ausgegeben werden?

Wenn Shellvariable "isMergePrintPdf" den Wert "true" hat, wird eine Xml- und eine Pdf-Datei erzeugt, welche alle Daten der Datei 1 und der Datei 2 sowie die Differenzen enthält.

Wenn Shellvariable "isMergeOnlyDiffPrintPdf" den Wert "true" hat, wird eine Xml- und eine Pdf-Datei erzeugt, welche nur die Differenzen enthält.

3. Mischen von Xml-Daten

3.1. Wie führe ich das Mischen von zwei Xml-Dateien aus?

Durch das Ausführen der Shellprozedur "xmlmerge.sh"

Syntax:
$ xmlmerge.sh <basic-control-file.xml> <merge-control-file> <file1.xml> <file2.xml>
Example:
$ xmlmerge.sh cmp1.xml merge1.xml test1a.xml test1b.xml

3.2. Wo kann ich die Mischregeln konfigurieren??

Die Mischregeln werden in der Mischsteuerungs-Datei konfiguriert.
Die Mischsteuerungs-Datei ist ebenso eine xml-Datei.

3.3. Wie kann ich eine Mischsteuerungs-Datei generieren?

Prozedur "xmlmergecreate.sh" kann eine Mischsteuerungs-Datei für eine Basissteuerungs-Datei generieren: Beispiel: Generieren der Mischsteuerungs-Datei "merge.xml" für die Basissteuerungs-Datei "cmp.xml".

Example
$ xmlmergecreate.sh cmp.xml > merge.xml

4. Umgruppieren von Xml-Daten

4.1. Wie führe ich das Umgruppieren von Xml-Daten aus?

Durch das Ausführen der Shellprozedur "xmltoxml.sh"

Syntax:
$ xmltoxml.sh <basic-control-file.xml> <toxml-control-file> <file.xml>
Beispiel:
$ xmltoxml.sh cmp1.xml toxml1.xml test1.xml

4.2. Wo kann ich die Umgruppierungsregeln konfigurieren?

Die Umgruppierungsregeln werden in der Umgruppierungssteuerungs-Datei (toxml-Datei) konfiguriert.
Die toxml-Datei ist ebenso eine Xml-Datei.

4.3. Wie kann ich eine Umgruppierungssteuerungs-Datei generieren?

Die toxml-Steuerungsdatei ist ebenso eine Xml-Datei. SIe hat nahezu den gleichen Aufbau und Struktur wie eine Basissteuerungs-Datei, daher kann man eine toxml-Steuerungsdatei erzeugen in dem man einfach eine Basisisteuerungs-Datei kopiert und mit Hilfe eines Editors anapaßt für die speziellen Bedürfnisse.

5. Sortieren von Xml-Daten

5.1. Wie führe ich das Sortieren von Xml-Daten aus?

Durch das Ausführen der Shellprozedur "xmlsort.sh"

Syntax:
$ xmlsort.sh <basic-control-file.xml> <sort-control-file> <file.xml>
Beispiel:
$ xmlsort.sh cmp1.xml sort1.xml test1.xml

5.2. Wo kann ich die Sortierregeln konfigurieren?

Die Sortierregeln müssen in der Sortiersteuerungs-Datei konfiguriert werden.
Die Sortiersteuerungsdatei ist ebenso eine Xml-Datei.

5.3. Wie kann ich eine Sortiersteuerungs-Datei generieren?

Prozedur "xmlsortcreate.sh" kann eine Sortiertsteuerungs-Datei generieren für eine bestimmte Basissteuerungs-Datei: Beispiel: Generieren einer Sortsteuerungs-Datei "sort.xml" für die Basissteuerungs-Datei "cmp.xml".

Example:
$ xmlsortcreate.sh cmp.xml > sort.xml

6. Performance

6.1. Kann ich große Dateien vergleichen?

Ja, Sie können.
"<xml>cmp" is designed, um sehr große Xml-Dateien zu vergleichen.

Das Vergleichen von sehr großen Xml-Dateien mit zum Beispiel einem Gigabyte ist geanus einfach wie das Vergleichen von Xml-Dateien mit wenigen Kilobytes.

Man muß nicht besonderes tun!
Es ist nicht nötig den Java-heap-size-Parameter zu erhöhen oder ähliches.

Es kommt nicht - nachdem man eine lange Zeit gewartet hat - die frustrierende Meldung "java.lang.OutOfMemoryError: java heap space", wie es oft bei anderen Vergleichtools der Fall ist.

6.2. Hauptspeicherbedarf beim Vergleichen großer Dateien?

Man kann sogar mit einer kleinen Java-heap-size von zum Beispiel 100 Megabytes große Dateien von über zum Beispiel 1 Gigabyte bei sehr guter Performance verarbeiten.

Das Erhöhen des Java-heap-size kann die Performance verbessern, aber im allgemeinen nur um wenige Prozentpunkte.

6.3. Plattenplatzbedarf?

Normalerweise benötigt man den dreifachen temporären Plattenplatz, von zwei zu vergleichenden Dateien, um diese vergleichen zu können.

Beispiel:
Wenn man zwei Dateien vergleicht, und jede hat ca. 100 Kilobytes, wird man car 600 kilobyte temporären Plattenplatz benötigen.

Wieviel Plattenplatz benötigt wird, hängt von vielen Faktoren ab. Wichtige Faktoren sind:

  • Wieviele Elemente/Attribute sind identifizierend für einen Satz ?
  • Wie stark hierarchisch geschachtelt sind die Sätze, welche viele identifizierende Elemente/Attribute haben.
  • Ob der Wert des Attributes element_sequence="true" ist?

In der Statistik-Datei wird protokolliert, wieviel temporärere Plattenplatz beansprucht wurde.

6.4. Parameter mit großen Einfluß auf die Performance?

<xml>cmp arbeitet mit bis zu drei Java-Threads.
Wenn man mehr Prozessoren hat, wird sich die Performance verbessern.

Die Performance der Platten ist entscheidend, weil die Dateien mehrmals in temporäre Dateien geschrieben werden. Man kann bis zu vier temporäre Verzeichnisse für diese Dateien definieren über die Shellvariablen TMPDIR, TMPDIR1, TMPDIR2 und TMPDIR3. Beste Performanceergebnisse erhält man , wenn die temporären Verzeichnisse verschieden schnelle Plattensteuerungen haben.

7. Verschiedenes

7.1. Ist <xml>cmp gegeignet für Regressionstests?

Ja! <xml>cmp ist designed für Regressionstests.

Für Regressionstests kann man den Exit-Code der Prozedur "xmlcmp.sh" auswerten. Exit-code ungleich "0" bedeutet, dass Unterschiede zwischen den beiden XMl-Dateien gefunden wurden..

7.2. Werden Beispiele ausgeliefert mit der <xml>cmp-Software?

Ja, es werden über ca. 100 selbsttestende Beispiele mit der Software ausgeliefert.
Man kann die Beispiele über Skript examples/execute-examples.sh. ausführen.

7.3. Werden Xml-Namespaces unterstützt?

Ja, Namespaces werden unterstützt.

7.4. Kann ich unterschiedliche Sax-Parser verwenden?

Ja.
Man kann irgendeinen JAXP1.1 kompatiblen Parser verwenden. Hierzu muß lediglich Shellvariable "parserClass" mit dem Namen der Java-Klasse des Parsers füllen.
In der Lieferung von <xml>cmp ist der Xerces-Sax-Parser der Default-Parser.

7.5. Xml-Daten vergleichen, die keine DTD oder Schema haben?

Man kann Xml-Daten vergleiche, die kein Schema oder DTD haben..
Auch wenn eine DTD vorhanden ist, werden die Dateien nicht gegen diese DTD geprüft.

7.6. Spezielle Software- oder Hardware-Anforderungen?

<xml>cmp benötigt J2SE 1.5.0 (Linux) oder höher. Prüfen Sie die Java-Version mit "$ java -version". (unter Windows,DOS J2SE 1.6.0 oder höher)

7.7. Gründe für "java.lang.Unsupported ClassVersionError" ?

Es ist nicht die richtige Java-Runtime-Environment vorhanden.
Man benötigt J2SE 1.5.0 oder höher. Prüfen Sie die Java-Version mit "$ java -version".

Logo SOFIKA GmbH

<xml>cmp-Werkzeugkasten

  • Vergleichen von Xml-Dateien
  • Mischen von Xml-Dateien
  • Umgruppieren von Xml-Dateien
  • Sortieren von Xml-Dateien

<xml>cmp und große Xml-Dateien

  • designed für große Xml-Dateien
  • wenig Hauptspeicherbedarf
  • sehr gute Performance

<xml>cmp-Aufrufmöglichkeiten

  • Unix/Dos-Kommandos
  • Java-Api

Differenzen werden im Context der Xml-Dateien dargestellt:

  • alle Daten + Differenzen
  • nur Differenzen
  • Darstellung: Xml und Pdf
Software Fischer SOFIKA GmbH
Freseniusstr. 65
D-81247 München
Deutschland
Tel: +49 (0)89 / 81 00 90 15
Fax: +49 (0)89 / 81 00 90 16
Email: info@sofika.de