Einzelnen Beitrag anzeigen

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