![]() |
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:
|
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:
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:
<?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>
Code:
Oder mit Delphi:
msxsl hoschie.xml extract.xsl -o extract.xml
Delphi-Quellcode:
(2) Beinahe vergessen: Selektieren und Clonen
// 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;
Delphi-Quellcode:
Ich finde beide schön.
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; |
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:
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.
doc := WebBrowser1.Document;
ws := doc.XMLDocument.XML; 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 |
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; |
Re: Datei bearbeiten und nur Teile wieder speichern
Ich versuche das gerade mal auf mich umzusetzen allerdings funktioniert dies hier nicht:
Delphi-Quellcode:
Er hat auch gar nicht CoDomDocument in der Programmierhilfe.
xdOld := CoDomDocument.Create;
xdOld.async := False; xdNew := CoDomDocument.Create; xdNew.async := False; Gruß Hoschie |
Re: Datei bearbeiten und nur Teile wieder speichern
Welche MSXML-Unit hast du denn mit USES eingebunden?
|
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.
|
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 |
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 |
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 15:30 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