![]() |
Re: Wie in XML-Datei sortieren?
Hi,
irgendwie haut das bei mir nicht hin. Ich liste mal etwas ausführlicher meine Schritte auf. Ich habe diesen Code
Delphi-Quellcode:
in die Datei "sortdata.xsl" im Order, wo sich auch die Anwendung befindet, gespeichert. In meinem Programm löst dies:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="/ | @* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"> <xsl:sort select="@titel"/> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:stylesheet>
Delphi-Quellcode:
eine Exception der Klasse "EAccessViolation" aus. Ich habe mal testweise sortdata.xsl durch data.xml, in der meine XML-Daten liegen, getauscht.
xmlStyle.load(FAppPath + 'sortdata.xsl');
Kein Problem. Es kann dann ja nur daran liegen, dass sortdata eine xsl-Datei ist. Hab ich was falsch gemacht? Gruß [edit=Matze]Beitrag aufgrund eines Caching-Fehlers neu abgesendet. MfG, Matze[/edit] |
Re: Wie in XML-Datei sortieren?
Wie hast du deine Variablen xmlDoc und xmlStyle deklariert, wie initialisiert?
Bist du mal im single step durch den Code gegangen? Ist xmlStyle eventuell nil? marabu |
Re: Wie in XML-Datei sortieren?
xmlDoc und xmlStyle sind beide vom Typ IXMLDOMDocument2. Initialisiert habe ich die nicht.
Wenn ich durch den Code gehe, dann ist xmlStyle nil. Beim xmlDoc bekomme ich einen Pointer. Toko |
Re: Wie in XML-Datei sortieren?
Wenn du keinen guten Grund für die Verwendung von IXMLDOMDocument2 hast, dann nimm IXMLDOMDocument. Ich unterstelle, dass du MSXML 4.0 installiert hast. Das Arbeiten mit dieser Schnittstelle sieht dann ungefähr so aus:
Delphi-Quellcode:
marabu
var
xmlStyle: IXMLDOMDocument; begin // erzeugen xmlStyle := CoDomDocument.Create; // app erhält Kontrolle erst nach vollständigem load() xmlStyle.async := false; // Erfolg testen if xmlStyle.load(fullFilename) then ShowMessage('smile') else ShowMessage(xmlStyle.parseError.reason); // so wird der vom DOM belegte Speicher wieder freigegeben xmlStyle := nil; end; |
Re: Wie in XML-Datei sortieren?
Ich bekomme ein :lol:
Ich hatte vorher das Create vergessen :wall: . Da hätte ich auch selbst drauf kommen können. Danke... toko |
Re: Wie in XML-Datei sortieren?
Hallo nochmal,
ich hab nun folgende Prozedur:
Delphi-Quellcode:
die ich bei einem ButtonClick aufrufe. Meine Daten in der XML-Datei sehen aber immer noch gleich aus.
procedure TfrmMain.sortXMLFile;
var xmlStyle: IXMLDOMDocument; begin xmlStyle := CoDomDocument.Create; xmlDoc := CoDOMDocument.Create; xmlDoc.load(xmlfile); xmlStyle.async := false; xmlStyle.load(FAppPath + 'data.xsl'); xmlDoc.load(xmlDoc.transformNode(xmlStyle)); cds := XMLDoc.documentElement.selectNodes('cd'); ... end; Hab ich was nicht beachtet? ToKo |
Re: Wie in XML-Datei sortieren?
Die XSL-Datei von marabu sorgt normalerweise nur für die interne Umsortierung der Daten. Die XML-Datei selbst bleibt unverändert, aber das DOM-Objekt deines Programms bekommt so die Daten sortiert geliefert.
|
Re: Wie in XML-Datei sortieren?
OK, versteh ich. Dann müßte ich doch auch mit dem DomObjekt arbeiten können. D.h. die Zeile:
Delphi-Quellcode:
dürfte dann keine EAccessViolationException auslösen.
cds := XMLDoc.documentElement.selectNodes('cd');
Beim öffnen einer XML-Datei gehe nämlich genauso vor, um die Daten aus dem DomObjekt ins StringGrid zu übertragen. Und das klappt ohne Probleme. :gruebel: Gruß ToKo |
Re: Wie in XML-Datei sortieren?
Zitat:
In meiner ersten Antwort hatte ich dir eine Code-Zeile gegeben, deren Sinn dir vielleicht entgangen ist:
Delphi-Quellcode:
Wenn du aus einer Datei lädst, dann verwende load(), wenn du einen XML-String parsen möchtest, dann verwende loadXML().
xmlDoc.loadXML(xmlDoc.transformNode(xmlStyle));
Matthias hat dich darauf hingewiesen, dass die Transformation mit XSLT nicht direkt auf den Originaldaten durchgeführt wird. Du erhältst neuen XML-Code, den du natürlich wieder in der gleichen DOM Variable verarbeiten kannst. Beim Speichern wird dann immer deine zuletzt erstellte Sortierung gespeichert. marabu |
Re: Wie in XML-Datei sortieren?
OK, jetzt klappts. Danke, marabu, für deine Geduld. Ich probiere gleich noch mal die Sortierung nach verschiedenen Knoten.
Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 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-2025 by Thomas Breitkreuz