Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Datei bearbeiten und nur Teile wieder speichern (https://www.delphipraxis.net/109379-datei-bearbeiten-und-nur-teile-wieder-speichern.html)

Hoschie 1. Mär 2008 17:48

Re: Datei bearbeiten und nur Teile wieder speichern
 
Jo, gibt nur eins und in dem Element Lehrgänge sind dann viele Unterelemente, und genau die benötige ich :-D

Das beste wäre, wenn am Ende sämtliche Unterlemente der Lehrgänge in einer neuen Datei zusammengelegt werden.

Gruß
Hoschie

Edit:
Zitat:

XML ist übrigens case-sensitive! Lehrgänge <> lehrgänge
Danke!! :mrgreen: Das wäre das erste typische HÄ??? wenns läuft, aber nix passiert.

marabu 1. Mär 2008 18:14

Re: Datei bearbeiten und nur Teile wieder speichern
 
Aus der Fülle der möglichen Vorgehensweisen stelle ich dir mal zwei vor:

(1) Transformation per XSLT

XML-Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

  <xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="/root/daten/lehrgänge"/>
  </xsl:template>
 
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="comment()"/>

</xsl:stylesheet>
Mit diesem Script wird zur Not auch auf der Kommandozeile (MSXSL.EXE bekommst du bei Microsoft, wenn du es noch nicht hast) dein Dokument umgeformt:

Code:
msxsl hoschie.xml extract.xsl -o extract.xml
Oder mit Delphi:

Delphi-Quellcode:
// uses ActiveX, Msxml, Classes, SysUtils

var
  fnOld, fnNew, fnStyle: TFileName;
  xdData, xdStyle: IXMLDOMDocument;
  fs: TFileStream;
begin
  fnOld := 'c:\daten\dp\hoschie.xml';
  fnStyle := 'c:\daten\dp\extract.xsl';
  fnNew := 'c:\daten\dp\extract.xml';
  xdData := CoDomDocument.Create;
  xdData.async := False;
  xdStyle := CoDomDocument.Create;
  xdStyle.async := False;
  if xdStyle.load(fnStyle) then
    if xdData.load(fnOld) then
    begin
      fs := TFileStream.Create(fnNew, fmCreate);
      try
        xdData.transformNodeToObject(xdStyle, TStreamAdapter.Create(fs, soReference) as IStream);
      finally
        fs.Free;
      end;
    end else ShowMessage('XML syntax error: ' + xdData.parseError.reason)
  else ShowMessage('XSLT syntax error: ' + xdStyle.parseError.reason)
end;
(2) Beinahe vergessen: Selektieren und Clonen

Delphi-Quellcode:
var
  fnOld, fnNew: TFileName;
  xdOld, xdNew: IXMLDOMDocument;
  xn: IXMLDOMNode;
begin
  fnOld := 'c:\daten\dp\hoschie.xml';
  fnNew := 'c:\daten\dp\extract.xml';
  xdOld := CoDomDocument.Create;
  xdOld.async := False;
  xdNew := CoDomDocument.Create;
  xdNew.async := False;
  if xdOld.load(fnOld) then
  begin
    xn := xdOld.selectSingleNode('/root/daten/lehrgänge');
    if Assigned(xn) then
    begin
      xdNew.documentElement := xn.cloneNode(True) as IXMLDOMElement;
      xdNew.save(fnNew);
    end else ShowMessage('keine lehrgänge gefunden')
  end else ShowMessage(xdOld.parseError.reason);
end;
Ich finde beide schön.

Hoschie 1. Mär 2008 18:59

Re: Datei bearbeiten und nur Teile wieder speichern
 
Und wieder ich :-D
Schön sind die Varianten alle :thumb:

Nochmal zum Verständnis, sorry wenn das etwas stümperhaft klingt:

Ich hole mir eine XML Datei aus dem Web, die lade ich so, wie du es mir in dem anderen Post mal vorgeschlagen hast :

Delphi-Quellcode:
doc := WebBrowser1.Document;
    ws := doc.XMLDocument.XML;
kann ich direkt aus der Variablen ws jetzt den XML-Code umwandeln, oder muss ich den erst in eine Datei speichern und dann die Datei umwandeln.
Theoretisch könnte ich mir eine komplette Schreib und Speicher Abfolge sparen, wenn ich aus der Variablen das umwandeln könnte und die unbenötigten Teile filtern könnte.
Oder sehe ich da was falsch ?

Danke

marabu 1. Mär 2008 19:52

Re: Datei bearbeiten und nur Teile wieder speichern
 
Huch, nein - du musst nicht über das Dateisystem gehen:

Delphi-Quellcode:
function GetXmlDocument(doc: OleVariant): IXMLDOMDocument;
var
  u: IUnknown;
  xd: IXMLDOMDocument;
begin
  u := doc.XMLDocument;
  if not Assigned(u) or not Succeeded(u.QueryInterface(IXMLDOMDocument, Result))
    then Result := nil;
end;

// How to use

var
  xd: IXMLDOMDocument;
begin
  xd := GetXmlDocument(WebBrowser.Document);
end;

Hoschie 1. Mär 2008 20:59

Re: Datei bearbeiten und nur Teile wieder speichern
 
Ich versuche das gerade mal auf mich umzusetzen allerdings funktioniert dies hier nicht:
Delphi-Quellcode:
  xdOld := CoDomDocument.Create;
  xdOld.async := False;
  xdNew := CoDomDocument.Create;
  xdNew.async := False;
Er hat auch gar nicht CoDomDocument in der Programmierhilfe.

Gruß
Hoschie

marabu 1. Mär 2008 21:04

Re: Datei bearbeiten und nur Teile wieder speichern
 
Welche MSXML-Unit hast du denn mit USES eingebunden?

Hoschie 1. Mär 2008 21:10

Re: Datei bearbeiten und nur Teile wieder speichern
 
Ich habe aus dem Link, den du gepostet hast nach der Anweisung dort die MSXML2_TLB eingebunden.

marabu 2. Mär 2008 10:00

Re: Datei bearbeiten und nur Teile wieder speichern
 
Moin,

anscheinend hast du dabei einen Fehler gemacht, sonst würde er die dort enthaltene Klasse CoDomDocument kennen.

Kann es sein, dass du die Unit MSXML2 zwar deinem Projekt hinzugefügt hast, aber nicht in die USES-Anweisung derjenigen Unit aufgenommen hast, in welcher der Compiler-Fehler auftritt?

Freundliche Grüße

Hoschie 2. Mär 2008 11:23

Re: Datei bearbeiten und nur Teile wieder speichern
 
Moin,

also im Uses habe ich die MSXML2_TLB drin, sonst würde er doch auch die IXMLDOMDocument nicht kennen, oder ? Bin etwas verwirrt jetzt, aber das ist nicht unnormal :-D

Gruß
Hoschie

marabu 2. Mär 2008 12:33

Re: Datei bearbeiten und nur Teile wieder speichern
 
Ich habe mir jetzt mal die von sakura bereit gestellten MSXML-Wrapper angeschaut. Die von ihm verwendete Version des Hilfsprogramms TLIBIMP korrigiert nicht nur Schlüsselwort-Kollisionen bei den Bezeichnern, sondern darüber hinaus auch einige Bezeichner, die vermutlich in neueren Versionen von Delphi zu Kollisionen mit CodeGear-eigenen Bezeichnern führen könnten. Das haben frühere Versionen des Hilfsprogramms nicht gemacht.

Du musst aufgrund der Umbennungen mit ComsDOMDocument arbeiten und nicht mit CoDomDocument. Fast der gesamte Beispielcode in der DP verwendet die alten Bezeichner, so dass du generell aufpassen und die Kommentare am Anfang der Units genau studieren musst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.
Seite 2 von 6     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz