Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Wie in XML-Datei sortieren? (https://www.delphipraxis.net/46747-wie-xml-datei-sortieren.html)

toko 1. Jun 2005 20:23

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:
<?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>
in die Datei "sortdata.xsl" im Order, wo sich auch die Anwendung befindet, gespeichert. In meinem Programm löst dies:
Delphi-Quellcode:
xmlStyle.load(FAppPath + 'sortdata.xsl');
eine Exception der Klasse "EAccessViolation" aus. Ich habe mal testweise sortdata.xsl durch data.xml, in der meine XML-Daten liegen, getauscht.
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]

marabu 1. Jun 2005 20:31

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

toko 1. Jun 2005 20:48

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

marabu 1. Jun 2005 21:09

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:
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;
marabu

toko 1. Jun 2005 21:33

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

toko 1. Jun 2005 22:07

Re: Wie in XML-Datei sortieren?
 
Hallo nochmal,

ich hab nun folgende Prozedur:
Delphi-Quellcode:
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;
die ich bei einem ButtonClick aufrufe. Meine Daten in der XML-Datei sehen aber immer noch gleich aus.

Hab ich was nicht beachtet?

ToKo

MathiasSimmack 1. Jun 2005 22:24

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.

toko 1. Jun 2005 23:10

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:
  cds := XMLDoc.documentElement.selectNodes('cd');
dürfte dann keine EAccessViolationException auslösen.

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

marabu 2. Jun 2005 06:26

Re: Wie in XML-Datei sortieren?
 
Zitat:

Zitat von toko
ich hab nun folgende Prozedur:
Delphi-Quellcode:
procedure TfrmMain.sortXMLFile;
var
  xmlStyle: IXMLDOMDocument;
begin
  ...
  xmlStyle.load(FAppPath + 'data.xsl');
  xmlDoc.load(xmlDoc.transformNode(xmlStyle));
  cds := XMLDoc.documentElement.selectNodes('cd');
  ...
end;

Wenn du mit diesem Code eine Access-Violation bekommst, dann wundert mich das nicht. In der ersten Zeile lädst du den XSLT-Code. Der Aufruf der Methode transformNode() in der zweiten Zeile generiert den sortierten XML-Code, die load() Methode erwartet aber einen URL und scheitert. Als Ergebnis ist documentElement nicht instanziiert. Beim Aufruf der Methode selectNodes() knallt es dann.

In meiner ersten Antwort hatte ich dir eine Code-Zeile gegeben, deren Sinn dir vielleicht entgangen ist:

Delphi-Quellcode:
xmlDoc.loadXML(xmlDoc.transformNode(xmlStyle));
Wenn du aus einer Datei lädst, dann verwende load(), wenn du einen XML-String parsen möchtest, dann verwende loadXML().

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

toko 2. Jun 2005 14:14

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.
Seite 2 von 3     12 3      

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