![]() |
XML: MD5 erzeugen, dazu: whitespace entfernen
Hallo Leute!
if (interessiert_an_Vorgeschichte=true) begin Ich muss einem Kunden regelmäßig XML dateien mit einem fest vorgegebenen format und (logisch) wechselndem Inhalt schicken. Zudem will ich einen MD5 hash erzeugen. Wenn der Kunde mir ein file zurückschickt und es beanstandet dann kann ich sofort sagen, ob er das file geändert hat oder nicht (die gesendeten files werden zwar archiviert aber man weiss ja nie...). Aber: Der Kunde könnte (aus Versehen?) das file "inhaltlich unrelevant" geändert haben (zusätzlicher whitespace ausserhalb der tags). Ergo ... end else begin Ich will bei einem XML file den "content irrelevanten" whitespace entfernen, damit ich einen "content relavanten" md5 hash erzeugen kann! MSXML hat zwar signaturfunktionen, aber die laufen alle darauf raus, dass ich diese in die XML datei reinpacke, was ich nicht will/darf. end ciao |
Re: XML: MD5 erzeugen, dazu: whitespace entfernen
Hi,
vielleicht musst du dich gar nicht um den white space kümmern, es würde ja schon eine Normierung des XML-Dokuments genügen. Dazu kannst du einfach per XSL-T eine identity transformation ohne white space preservation durchführen. Code-Beispiele dazu solltest du mit den entsprechenden Suchworten hier im Forum finden. Gute Nacht |
Re: XML: MD5 erzeugen, dazu: whitespace entfernen
Hmm, das "else" ist falsch, weil sonst hättest du mit der Vorgeschichte keine Frage...
Ansonsten: Die nicht relevanten WhiteSpaces sind dir doch auch egal, schliesslich würdest du sie auch nicht im Hashteil haben. Somit interessieren dich nur Änderungen in den Knoten bzw. Inhalten. Um dies zu verhindern, könntest du eine restriktive DTD schreiben, welche nur die genau in den jeweiligen Knoten eingetragenen Werte erlaubt. Damit kannst du Änderungen zwar nur soweit verhindern, als dass er die DTD mit verändern müsste. Ob er dort Änderungen gemacht hat, kannst du aber einfach überprüfen, in dem du die zurück bekommene XML gegenüber deiner damaligen DTD überprüfst und du bekommst entsprechend angezeigt wo. Aber es ist recht abstruss, aber du müsstest die XML Datei nicht ändern bzw. anpassen (ok, bis auf den DTD Link im Header). |
Re: XML: MD5 erzeugen, dazu: whitespace entfernen
@Muetze:
Das ist mir schon zu aufwändig. Ich hab auch keine ahnung wie oft der Kunde die Struktur der von mir zu erstellenden XML Dokumente ändern wird (und ich damit eine von mir erstellte DTD zu pflegen habe). Ich will einfach in eriner "Logdatei" (automatisiert) mitloggen: Timestamp, Filename, MD5-Hash. Ich will mich gar nicht mit XSL (noch keine Ahnung), DTD (Ahnung schon aber keine Lust) rumärgern müssen. So wie die Struktur der XML Datei derzeit ist wird da ohnehin noch viel gedreht werden. Der gute Kunde hat einfach seine bisherige Access-Datenbank(tabellen) in XML files "rausgehauen" mit nem haufen overhead drin, da grausst es einem - aber das nur am rande. @marabu: so ne XSL-T transformation geht doch auch nur wenn ich die struktur der XML datei (im prinzip die nicht vorhandene DTD) kenne, oder? Wie gesagt: von XSL hab ich keine ahnung. Kann ich da definieren: hau mir das ganze file raus ohne whitespace, egal was für knotennamen ich da drin vorfinde? Ciao |
Re: XML: MD5 erzeugen, dazu: whitespace entfernen
Ja sicher kannst du, es wird ja bei einer identity transformation nur valides XML vorausgesetzt. Suche bitte mal nach diesem terminus technicus, da muss es mindestens einen Beitrag von mir zu geben. Muss jetzt ins Bettchen, bin sehr müde.
|
Re: XML: MD5 erzeugen, dazu: whitespace entfernen
Hallo,
mit diesem Script solltest du dein XML-Dokument normieren können:
Code:
Wenn du nicht möchtest, dass neben leeren Textknoten auch Kommentare entfernt werden, dann entfernst du einfach das entsprechende xsl:template.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output method="xml" version="1.0" encoding="utf-8" indent="no"/> <xsl:strip-space elements="*"/> <xsl:template match="/ | @* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="comment()"/> </xsl:stylesheet> Die Anwendung der Methode transformNode() in Delphi ist nicht schwierig. Ein funktionierendes Beispiel findest du z.B. hier: ![]() Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz