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.