2009-06-13 13 views
1

Gibt es eine JavaScript-Implementierung, um Deltas zwischen XML-Daten zu behandeln? Der Hauptpunkt besteht darin, die Existenz der Differenz zu erkennen, es spielt keine Rolle, was geändert wurde: Attribut- oder Knotenwert.JavaScript-Implementierung von XML-Unterschieden

Anforderungen sind wie folgt:

  • jeder Knoten eindeutige ID haben (es ist eines der Vereinfachungen gemacht, um mehr Kandidaten-Bibliotheken zu finden)
  • Deltas in Knoten überprüft werden sollen, Attribute und Knotenwerte
  • Unterstützung XML-Knoten Hierarchien bis zu 3 Ebenen
  • das Ergebnis der Berechnung sollte auch XML (siehe Beispiel), aber es könnte drei Arrays hinzugefügt, aktualisiert und gelöscht Knoten seiner
  • ignorieren einige Unterknoten in Delta-Berechnung, zum Beispiel möchte ich nur 3 Ebenen der Hierarchie verfolgen, nicht mehr
  • Änderungen Erkennung sollte nicht an die oberen Knoten weitergegeben werden, so zum Beispiel Kindknoten Änderungen sollten Elternknoten nicht aktualisiert werden
Hier

ist Beispiel dafür, wie es funktionieren sollte:
XML # 1:

<node id="0"> 
    <node id="1"> 
    <node id="4"> 
     <node id="23">DATA</data> 
    </node> 
    <node id="5">DATA</node> 
    </node> 
</node> 

XML # 2:

<node id="0"> 
    <node id="1"> 
    <node id="3"> 
     <node id="342">DATA</data> 
    </node> 
    <node id="5" some_attribute="attr"/> 
    </node> 
    <node id="6"/> 
</node > 

So sollte einem Ergebnis führen, das folgende:

<result> 
    <added> 
     <id>6</id> 
     <id>3</id> 
     <id>342</id> 
    </added> 
    <updated> 
     <id>5</id> 
    </updated> 
    <removed> 
     <id>4</id> 
     <id>23</id> 
    </removed> 
</result> 
+0

Während dies in JS streng möglich sein wird, bezweifle ich, dass es einfach, effizient oder zuverlässig sein wird. Können Sie uns sagen, warum Sie dies in JS tun müssen, anstatt in der offensichtlichen XSLT? – annakata

+0

Vielleicht wird XSLT in einigen Situationen nützlich sein, aber es erfordert serverseitige Änderungen für uns, was unangemessen ist. Mein Anwendungsfall ist, dass wir eine schwergewichtige clientseitige Komponente verwenden und das vollständige erneute Rendern einer solchen Komponente langsam ist. Diese Komponente lädt bestimmte XML-Dateien, wenn sie geändert wurden. Sie sollte jedoch nur geänderte Teile erneut ausgeben, jedoch nicht vollständig. Ich denke über eine transparente Http-Proxy-Komponente eine Art "Delta-Engine" nach, aber es ist eine Frage aus einem anderen Kontext. Ich werde eine neue Frage beginnen, wenn ich hier kein Glück haben werde. –

Antwort

0

Ich bin kein großer Nutzer von XSLT, aber ich bin sicher, dass Sie es verwenden könnte zu erreichen, was Sie versuchen, wenn Sie zu tun, sind vertraut mit es. Vielleicht sollten Sie versuchen, das Tag zu der Frage hinzuzufügen.

Das folgende XSLT-Dokument, aus http://msdn.microsoft.com/en-us/magazine/cc164169.aspx genommen, fusioniert angeblich zwei Dokumente, aber ich bezweifle, dass es so gründlich sein würde, wie Sie es wollen:

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <Container> 
     <xsl:copy-of select="document('product.xml')"/> 
     <xsl:copy-of select="document('material.xml')"/>   
    </Container> 
    </xsl:template> 
</xsl:stylesheet> 

Die Beispiele auf dieser Seite sind für .NET, aber Internet Explorer hat Zugriff auf viele MSXML ActiveX-Steuerelemente, die möglicherweise die Funktionen bereitstellen, die Sie benötigen, wenn keine browserübergreifende Kompatibilität erforderlich ist.

+0

Ich würde +1 wenn das OP war in Ordnung mit XSLT, Merges ist eine ziemlich häufige und googleable Anwendungsfall für XSLT. – annakata

+0

Wahr. Eine andere Möglichkeit wäre, jeden Knoten und jedes Attribut in XMLFile1 zu durchlaufen und dann eine XMLFile2.selectSingleNode() auszuführen, die den XPath-Ausdruck des Knotens oder Attributs übergibt, um zu prüfen, ob er existiert, und dann ein ==0 für die Knotenwerte zu verwenden Prüfen Sie, ob sie unterschiedlich sind, und schreiben Sie das Ergebnis wie oben beschrieben in eine dritte XML-Datei. Ich wünschte nur, ich hätte die Zeit, es zu schreiben :-) –

+0

Sorry, aber Cross-Browser-Kompatibilität ist eine starke Anforderung.Serverseitige Entwicklung für XSLT-Vorlagen ist nicht im Zusammenhang. –