Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » InDesign CS5 XML Vergleich mit vorherigem Element

InDesign CS5 XML Vergleich mit vorherigem Element

JonesRidder
Beiträge gesamt: 85

26. Apr 2011, 10:49
Bewertung:

gelesen: 3577

Beitrag als Lesezeichen
Hallo,

ich möchte folgendes in Code ausdrücken:
"Wenn der aktuelle Datensatz XML-Element <Rubrik> nicht dem vorherigen Datensatz XML-Element <Rubrik> entspricht, dann mache das ....
wenn nicht, dann geh weiter im Code (kein else Zweig also)".

Mein XML Aufbau:
Code
<dataroot> 
<Artikel><Rubrik>TestRubrik1</Rubrik>...</Artikel>
<Artikel><Rubrik>TestRubrik2</Rubrik>...</Artikel>
<Artikel><Rubrik>TestRubrik3</Rubrik>...</Artikel>
<Artikel><Rubrik>TestRubrik3</Rubrik>...</Artikel>
...
</dataroot>


Mein Codeschnipsel dafür:
Code
var _dok = app.activeDocument; 
var _root = _dok.xmlElements[0];
var _artikel = _root.xmlElements[i];
//....
if (_artikel.xmlElements[i].xmlElements.itemByName("Rubrik") != _artikel.xmlElements[i--].xmlElements.itemByName("Rubrik")) {
} //...



Weiß einer wie ich das hinbekomme?
Erläuterungen: "i--" soll - so dachte ich mir - "den vorherigen Datensatz" darstellen. Ist das so richtig?

Gruß
J.R.

InDesign CS5 XML Vergleich mit vorherigem Element

Martin Fischer
  
Beiträge gesamt: 12783

26. Apr 2011, 11:20
Bewertung:

gelesen: 3565

Beitrag als Lesezeichen
i-- setzt den Zähler um 1 zurück.
Das kann im ersten Moment zwar den gewünschten Effekt herbeiführen.
Allerdings kann das die weitere Ausführung der Schleife stören.

Verwende statt dessen i-1.
Das beläßt den Zähler unverändert.

Statt dem XML-Element solltest Du vielleicht eine bestimmte Eigenschaft (oder mehrere), in der die verglichenen XML-Elemente unterscheiden bzw. nicht unterscheiden sollen, spezifizieren.
Denn in einer Eigenschaft sind die XML-Elemente immer unterschiedlich: in der id. Deswegen wirst Du beim direkten Vergleich von zwei XML-Elementen nie eine eindeutige Übereinstimmung bekommen.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 26. Apr 2011, 11:21 geändert)

InDesign CS5 XML Vergleich mit vorherigem Element

JonesRidder
Beiträge gesamt: 85

26. Apr 2011, 11:59
Bewertung:

gelesen: 3551

Beitrag als Lesezeichen
Zitat i-- setzt den Zähler um 1 zurück.
Das kann im ersten Moment zwar den gewünschten Effekt herbeiführen.
Allerdings kann das die weitere Ausführung der Schleife stören.

Verwende statt dessen i-1.
Das beläßt den Zähler unverändert.

OK - gemacht.

Zitat Statt dem XML-Element solltest Du vielleicht eine bestimmte Eigenschaft (oder mehrere), in der die verglichenen XML-Elemente unterscheiden bzw. nicht unterscheiden sollen, spezifizieren.
Denn in einer Eigenschaft sind die XML-Elemente immer unterschiedlich: in der id. Deswegen wirst Du beim direkten Vergleich von zwei XML-Elementen nie eine eindeutige Übereinstimmung bekommen.

Die ID ist soweit ich weiß immer unterschiedlich. D.h. Wenn ich den Fall habe, dass zwei Artikel Elemente die selbe Rubrik haben, ist Rubrik1 ungleich Rubrik2 (obwhol beide den Inhalt "TestRubrik1" haben und somit - für meine Zwecke - gleich sind).

Wenn folgender Fall zutrifft:
Code
<dataroot> 
<Artikel><Rubrik>TestRubrik1</Rubrik>...</Artikel>
<Artikel><Rubrik>TestRubrik2</Rubrik>...</Artikel>
<Artikel><Rubrik>TestRubrik3</Rubrik>...</Artikel>
<Artikel><Rubrik>TestRubrik3</Rubrik>...</Artikel>
...
</dataroot>

... dann ist es eindeutig, dass das
zweite Artikel Element ungleich dem ersten Artikel Element ist, das dritte ungleich dem zweiten
und das vierte gleich dem dritten ist.

Ich vermute, dass meine Syntax nicht stimmt.
Wenn ich nämlich folgende CodeZeile ins IF einfüge {HIER} (um zu testen, was das Programm zum Vergleich überhaupt heranzieht) ...
Code
alert (_artikel.xmlElements[i].xmlElements.itemByName("Rubrik")); 
alert (_artikel.xmlElements[i-1].xmlElements.itemByName("Rubrik"));

... dann gibt er mir in der MsgBox nicht den Inhalt des jeweiligen XML Tags Rubrik aus sondern "[object XMLElement]".

InDesign CS5 XML Vergleich mit vorherigem Element

Martin Fischer
  
Beiträge gesamt: 12783

26. Apr 2011, 12:22
Bewertung:

gelesen: 3544

Beitrag als Lesezeichen
Verwende für den Inhalt eines XML-Elements die contents-property.

Code
alert (_artikel.xmlElements[i].xmlElements.itemByName("Rubrik").contents);  
alert (_artikel.xmlElements[i-1].xmlElements.itemByName("Rubrik").contents);



Der Inhalt (contents) ist nur eine von vielen Eigenschaften eines XML-Elements.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 26. Apr 2011, 13:35 geändert)

InDesign CS5 XML Vergleich mit vorherigem Element

JonesRidder
Beiträge gesamt: 85

26. Apr 2011, 15:01
Bewertung:

gelesen: 3496

Beitrag als Lesezeichen
Das mit CONTENTS funktioniert - danke für den Tipp.

Das ...
Code
if (_root.xmlElements[i].xmlElements.itemByName("Rubrik") != _root.xmlElements[i-1].xmlElements.itemByName("Rubrik")) 
{ alert (_root.xmlElements[i-1].xmlElements.itemByName("Rubrik").contents + " NEXT " + _root.xmlElements[i].xmlElements.itemByName("Rubrik").contents); }

(wie du versucht hast mich vorher drüber aufzuklären) scheint nicht zu funktionieren. Die MsgBox erscheint auch dann, wenn zwei aufeinanderfolgende XML Elemente den selben Inhalt haben (Ausgabe dann: "TestRubrik1 NEXT TestRubrik1"). Folglich sind also alle Elemente, auch wenn sie den selben Namen und Inhalt haben immer ungleich.

Wie kann ich denn jetzt unterscheiden zwischen verschiedenen Inhalten eines XML Elements mit selben Namen?
Über die ID (woher ich die auch immer kriegen soll?) würde es auch nicht gehen, weil diese ja IMMER unterschiedlich ist und es ja Fälle gibt, in denen sich Rubriken mit gleichen Namen wiederholen. Oder ist es etwa so, dass in solch einem Fall:

Code
  ... 
<Artikel><Rubrik>TestRubrik3</Rubrik>...</Artikel>
<Artikel><Rubrik>TestRubrik3</Rubrik>...</Artikel> ...

beide Elemente <Rubrik> (sowohl obere als auch untere -1. und 2.) die selbe ID bekommen, weil sie den selben Inhalt haben??

Gruß
J.R.

InDesign CS5 XML Vergleich mit vorherigem Element

Martin Fischer
  
Beiträge gesamt: 12783

26. Apr 2011, 15:19
Bewertung:

gelesen: 3487

Beitrag als Lesezeichen
Antwort auf: Wie kann ich denn jetzt unterscheiden zwischen verschiedenen Inhalten eines XML Elements mit selben Namen?


Du darfst nicht die XML-Elemente miteinander vergleichen, sondern musst die Inhalte (contents) der XML-Elemente (oder andere Eigenschaften wie texts ...) vergleichen.
Code
if (_root.xmlElements[i].xmlElements.itemByName("Rubrik").contents != _root.xmlElements[i-1].xmlElements.itemByName("Rubrik").contents) 


Nein, zwei Objekte können sich nicht eine ID teilen.
Auch wenn sie in allen anderen Eigenschaften übereinstimmen.
Es gibt keine eineiigen Zwillinge.

Es ist eine grundlegende Aufgabe der ID, Objekte, die in allen anderen Eigenschaften miteinander übereinstimmen, voneinander zu unterschieden.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 26. Apr 2011, 15:20 geändert)

InDesign CS5 XML Vergleich mit vorherigem Element

WernerPerplies
Beiträge gesamt: 2762

26. Apr 2011, 16:18
Bewertung:

gelesen: 3462

Beitrag als Lesezeichen
Hallo J.R.

jetzt mal ganz unabhängig von JavaScript und InDesign:

Wie Dir Martin schon sagt, Du must Inhalte vergleichen.

Die einzelnen XML-Elemente werden intern als Objekt verwaltet und sind nur dann gleich, wenn ihre (interne Adresse -> Referenz) identisch ist.

Damit wäre auch zwei XML-Elemente mit gleicher ID und kompletten gleichem Inhalt unterschiedlich, wenn sie intern eine unterschiedliche Adresse hätten.

Um ein XML-Element komplett mit einem zweiten Element zu vergleichen, müsstest Du jedes enthaltene Element mit dem entsprechenden Element im anderen Element vergleichen.

Das würde natürlich hier wieder zur Ungleichheit führen, da bei Dir Elemente mit unterschiedlicher ID aber ansonsten gleichem Inhalt bei einem vollständigen Vergleich ungleich werden. Deshalb musst Du die ID beim Vergleich ausklammern.

Dein Vergleich müsste in etwas so aussehen:

bool Vergleich(XML-Element1, XML-Element2)
{
if (XML-Element1.name != XML-Element2.name) return false;
if (XML-Element1.Attributes.Count != XML-Element2.Attributes.Count) return false;
if (XML-Element1.AlleAttributeOhneID != XML-Element2.AlleAttributeOhneID!) return false;
if (XML-Element1.Childs.Count != XML-Element2.Childs.Count) return false;
for(jedes Child in XML-Element1 und jedes Child in XML-Element2) -> if (!(Vergleich(ChildOfElement1, ChildElement2)return false))
if (XML-Element1.content != XML-Element2.content) return false;
return true;
}

Weiteres Problem: die Reihenfolge der Childs und/oder Attribute könnte unterschiedlich sein und trotzdem könnte ein Element gleich sein.

Falls so etwas vorkommen sollte, müssten die Childs/Attribute vor dem Vergleich sortiert werden.

Für eine vollständige Lösung müssten natürlich noch weitere Elemente (Kommentare, Whitespaces ...) berücksichtigt werden.

So, ich hoffe, mein Pseudo-Code ist einigermaßen verständlich.

Wenn ja, solltest Du die Logik in die von Dir gewünschte Sprache übertragbar sein.

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

(Dieser Beitrag wurde von WernerPerplies am 26. Apr 2011, 16:30 geändert)

InDesign CS5 XML Vergleich mit vorherigem Element

Dirk Becker
Beiträge gesamt: 193

26. Apr 2011, 22:31
Bewertung:

gelesen: 3434

Beitrag als Lesezeichen
Die ID von XML Elementen (der Wert von myXMLElement.id) ist nur innerhalb der parentStory eindeutig, also pro Kette von Rahmen. XMLElement ist damit eine große Ausnahme im InDesign Objektmodell.

So kann es, wie von Werner beschrieben, tatsächlich zu unterschiedlichen Elementen mit gleicher ID kommen.

Dirk

InDesign CS5 XML Vergleich mit vorherigem Element

Martin Fischer
  
Beiträge gesamt: 12783

27. Apr 2011, 08:37
Bewertung:

gelesen: 3410

Beitrag als Lesezeichen
Antwort auf [ Dirk Becker ] Die ID von XML Elementen (der Wert von myXMLElement.id) ist nur innerhalb der parentStory eindeutig, also pro Kette von Rahmen.


Ja, meine Behauptung, es könne in einem Dokument keine XML-Elemente mit identischer ID geben, ist falsch.

Ich hatte bei meinen Überlegungen außer Acht gelassen, dass der Fragesteller möglicherweise mit mehr als einem Textabschnitt arbeitet. Zudem hatte ich den Fokus zu sehr auf den Vergleich unmittelbar benachbarter XML-Elemente (aufeinander folgende) gerichtet.

Für die Lösung des angesprochenen Problems hatte ich den Weg der Herbeiführung von XML-Elementen mit gleicher ID, wenn sie in allen anderen Eigenschaften übereinstimmen, für nicht erfolgversprechend betrachtet. Was wäre damit gewonnen, wenn auf dem Weg dahin ohnehin ein Vergleich aller anderen Eigenschaften nötig wäre?

Meine Intention war, den Blick auf den Vergleich einer Auswahl von Eigenschaften zu richten.
Wann gelten im Hinblick auf die Aufgabenstellung zwei aufeinanderfolgende XML-Elemente als gleich?
a) Genau dann, wenn sie in allen Eigenschaften miteinander übereinstimmen (die ID eingeschlossen oder ausgeschlossen)?
b) Ist es hinreichend, wenn sie in einer oder wenigen Eigenschaft(en) (z.B. contents) übereinstimmen?

Darüberhinaus sollte geklärt werden, ob es genügt, die/einige Eigenschaften unmittelbar aufeinander folgender XML-Elemente (i : i-1) zu vergleichen oder ob jedes XML-Element mit jedem anderen verglichen werden muss.
Das hängt u.a. von der Anlage der Daten ab.
Möglicherweise interessiert es die Aufgabenstellung nicht, ob das 2. XML-Element mit den relevanten Eigenschaften des 200. XML-Elements übereinstimmt, wenn mindestens ein XML-Element mit einer Abweichung in den relevanten Eigenschaften dazwischenliegt.
Oder eine solche Übereinstimmung kann von der Erzeugung der Daten her ausgeschlossen werden ...

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 27. Apr 2011, 09:04 geändert)

InDesign CS5 XML Vergleich mit vorherigem Element

JonesRidder
Beiträge gesamt: 85

28. Apr 2011, 09:00
Bewertung:

gelesen: 3369

Beitrag als Lesezeichen
Problem gelöst!
Vielen Dank an die Experten Martin Fischer und Dirk Becker!
Für meine Problestellung hat der Hinweis von Martin Fischer (Beitrag ID: #469874), dass ich ".contents" anwenden soll im Vergleich, ausgereicht.
Gruß
J.R.

(Dieser Beitrag wurde von JonesRidder am 28. Apr 2011, 09:07 geändert)