AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Datei bearbeiten und nur Teile wieder speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Datei bearbeiten und nur Teile wieder speichern

Ein Thema von Hoschie · begonnen am 29. Feb 2008 · letzter Beitrag vom 8. Mär 2008
Antwort Antwort
Seite 2 von 6     12 34     Letzte »    
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#11

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 18:48
Jo, gibt nur eins und in dem Element Lehrgänge sind dann viele Unterelemente, und genau die benötige ich

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!! Das wäre das erste typische HÄ??? wenns läuft, aber nix passiert.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#12

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 19:14
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.
  Mit Zitat antworten Zitat
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#13

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 19:59
Und wieder ich
Schön sind die Varianten alle

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#14

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 20:52
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;
  Mit Zitat antworten Zitat
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#15

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 21:59
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#16

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 22:04
Welche MSXML-Unit hast du denn mit USES eingebunden?
  Mit Zitat antworten Zitat
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#17

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 22:10
Ich habe aus dem Link, den du gepostet hast nach der Anweisung dort die MSXML2_TLB eingebunden.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#18

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 2. Mär 2008, 11:00
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
  Mit Zitat antworten Zitat
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#19

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 2. Mär 2008, 12:23
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

Gruß
Hoschie
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#20

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 2. Mär 2008, 13:33
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 6     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 Uhr.
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