diff/patch des Subbaums auf gesamtBaum

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • diff/patch des Subbaums auf gesamtBaum

    Hallo @all,

    ich stehen vor dem folgenden Problem:
    Ich habe hier einen große XML datei(20MB). Der Baum hat in etwa 20000 Blätter.
    Weil ich nicht am ganzen Baum änderungen vornehmen werden, extrahiere ich von dieser Datei eine Subbaum, indem ich einen großen Teil der Blätter des Baumes beim extrahieren lösche. An dieser kleineren XML datei mache ich einige Änderungen und lasse mir eine diff ausgeben. Und hier fängt mein Problem an: Alle diff-Anwendungen die ich bis jetzt benutzt hatte , geben mir in der diff, xpath Ausdrücke aus, die sich auf den kleinen Baum beziehen. Wie z.b. xpath = /..../Chid[250] : Holen die Referenz zum 250. Kindsknoten. Diese diff kann ich aber nicht auf die Große Datei anwenden, weil der 250. Kindsknoten ein Knoten sein kann(in der große XML-Datei), denn ich vorher nicht extrahiert hatte.(die Reihenfolge hat sich ja geändert).
    Was ich gerne haben würde , wäre, dass er mir den XPath Ausdrück bzgl. eines attributes geben würde(=> für die Blätte). Bei mir wäre es das Attribute 'id' . Der ist bei mir eindeutig und wird als uuid generiert.

    Kennt jemand die Lösung meines Problems ??

    Zusammenfassung :

    1.) großexml.xml -----> file1.xml (extrahiertes Subbaum)

    2.) file1.xml + file2.xml(geändertes file1.xml) ----> diff.xml (XUpdate datei oder ähnliches)

    3.) patch der großexml.xml mit diff.xml


    Ich hoffe, ich konnte mein Problem erständlich erläutern [Blockierte Grafik: http://entwickler-forum.de/images/smilies/rolleyes.gif]


    Grüße
    Oc86
  • ein Vorschlag von mir ohne gewähr

    Hallo unbekannterweise
    zum test

    grosse xml Datei

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <root>
    3. <item was="orginal">
    4. <einordung>1</einordung>
    5. <daten>erg1</daten>
    6. <pos>1</pos>
    7. </item>
    8. <item was="orginal">
    9. <einordung>2</einordung>
    10. <daten>erg2</daten>
    11. <pos>2</pos>
    12. </item>
    13. <item was="orginal">
    14. <einordung>3</einordung>
    15. <daten>erg3</daten>
    16. <pos>3</pos>
    17. </item>
    18. </root>
    Alles anzeigen

    diff xml Datei

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <root>
    3. <item was="diff">
    4. <einordung>4</einordung>
    5. <daten>erg10</daten>
    6. <pos>1</pos>
    7. </item>
    8. <item was="diff">
    9. <einordung>1</einordung>
    10. <daten>erg5</daten>
    11. <pos>2</pos>
    12. </item>
    13. </root>
    Alles anzeigen


    es gibt mehre Möglichkeiten haben aber viele kleine Fehlerfallen deshalb hier die einfache Lösung

    über die interne DTD ein neuen xml datei die beiden xml datei grosse und diff lädt.

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE book [
    3. <!ENTITY gesamt SYSTEM "grossfile.xml">
    4. <!ENTITY diff SYSTEM "diff.xml">
    5. ]>
    6. <rootges>
    7. &gesamt;
    8. &diff;
    9. </rootges>

    Hinweise:
    über den Umweg derEntities werden die beiden Dateien geladen
    Java Parser verlangen in der ersten Zeile der beiden xml dateien die xml anweisung

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>

    damit die Auflösung der Zeichen definiert(ISO-8859-1 oder UTF-8)
    In der bei mir genannten xml datei ist folgender tree zu erkennen

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <rootges>
    3. <root>
    4. <item was="orginal">
    5. <einordung>1</einordung>
    6. <daten>erg1</daten>
    7. <pos>1</pos>
    8. </item>
    9. <item was="orginal">
    10. <einordung>2</einordung>
    11. <daten>erg2</daten>
    12. <pos>2</pos>
    13. </item>
    14. <item was="orginal">
    15. <einordung>3</einordung>
    16. <daten>erg3</daten>
    17. <pos>3</pos>
    18. </item>
    19. </root>
    20. <root>
    21. <item was="diff">
    22. <einordung>4</einordung>
    23. <daten>erg10</daten>
    24. <pos>1</pos>
    25. </item>
    26. <item was="diff">
    27. <einordung>1</einordung>
    28. <daten>erg5</daten>
    29. <pos>2</pos>
    30. </item>
    31. </root>
    32. </rootges>
    Alles anzeigen


    damit kann jetzt die Auswertung erfolgen


    mit xls

    Quellcode

    1. <?xml version="1.0"?>
    2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:output method="xml" indent="yes"/>
    4. <xsl:variable name="root1" select="rootges/root[1]"/>
    5. [color=#ff0000]<!-- in grosserxml -->[/color]
    6. <xsl:variable name="root2" select="rootges/root[2]"/>
    7. [color=#ff0000]<!-- in diffxml -->[/color]
    8. <xsl:template match="/">
    9. <ergroot>
    10. <xsl:apply-templates select="rootges"/>
    11. </ergroot>
    12. </xsl:template>
    13. <xsl:template match="rootges">
    14. <xsl:apply-templates select="root[1]"/>
    15. [color=#ff0000]<!-- Änderung feststellen -->[/color]
    16. <xsl:apply-templates select="root[2]">
    17. <xsl:with-param name="wo" select="2"/>
    18. [color=#ff0000]<!-- Neue in Diff anzeigen -->[/color]
    19. </xsl:apply-templates>
    20. </xsl:template>
    21. <xsl:template match="root">
    22. <xsl:param name="wo" select="1"/>
    23. <xsl:apply-templates select="item">
    24. <xsl:with-param name="wo" select="$wo"/>
    25. </xsl:apply-templates>
    26. </xsl:template>
    27. <xsl:template match="item">
    28. <xsl:param name="wo"/>
    29. <xsl:variable select="einordung" name="ein"/>
    30. <xsl:choose>
    31. <xsl:when test="$root2/item/einordung=$ein and $wo=1">
    32. <erg>
    33. <xsl:copy-of select="$root2/item[einordung=$ein]"/>
    34. </erg>
    35. </xsl:when>
    36. <xsl:when test="$root1/item[einordung=$ein] and $wo=2">
    37. <!-- mache nichts -->
    38. </xsl:when>
    39. <xsl:otherwise>
    40. <erg>
    41. <xsl:copy-of select="daten/.."/>
    42. </erg>
    43. </xsl:otherwise>
    44. </xsl:choose>
    45. </xsl:template>
    46. </xsl:stylesheet>
    Alles anzeigen

    Ergebnis

    Quellcode

    1. <?xml version='1.0' encoding='utf-8' ?>
    2. <ergroot>
    3. <erg>
    4. <item was="diff">
    5. <einordung>1</einordung>
    6. <daten>erg5</daten>
    7. <pos>2</pos>
    8. </item>
    9. </erg>
    10. <erg>
    11. <item was="orginal">
    12. <einordung>2</einordung>
    13. <daten>erg2</daten>
    14. <pos>2</pos>
    15. </item>
    16. </erg>
    17. <erg>
    18. <item was="orginal">
    19. <einordung>3</einordung>
    20. <daten>erg3</daten>
    21. <pos>3</pos>
    22. </item>
    23. </erg>
    24. <erg>
    25. <item was="diff">
    26. <einordung>4</einordung>
    27. <daten>erg10</daten>
    28. <pos>1</pos>
    29. </item>
    30. </erg>
    31. </ergroot>
    Alles anzeigen


    hoffe das hilft oder nehme kontakt auf
    Helmut Hagemann
    Derjenige, der sagt: Das geht nicht, soll den nicht stören, der's gerade tut.