Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi MSXML: NodeName ändern (https://www.delphipraxis.net/60696-msxml-nodename-aendern.html)

Aenogym 11. Jan 2006 07:52


MSXML: NodeName ändern
 
hi ihr,

wie kann ich den NodeName eines IXMLDOMNodes ändern, den ich per SelectSingleNode() bekommen habe?
eigenschaften wie NodeName sind leider read-only :(

ich möchte das node von "<alt attr="test"></alt>" zu "<neu attr="test"></neu>" ändern.

danke euch,
aeno

marabu 11. Jan 2006 10:55

Re: MSXML: NodeName ändern
 
Hallo Steffen,

es gibt viele Wege, wie du einen Node umbenennen kannst. Ich zeige dir, wie du diese Aufgabe vom MSXML Parser erledigen lassen kannst:

Delphi-Quellcode:
// uses MSXML2;

procedure RenameElements(doc: IXMLDOMDocument; const sXPath, sNewTagName: string);
const
  TransformCode
    = '<?xml version="1.0"?>'
    + '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">'
    + '<xsl:template match="%s">'
    + ' <xsl:element name="%s">'
    + '   <xsl:apply-templates select="@* | node()"/>'
    + ' </xsl:element>'
    + '</xsl:template>'
    + '<xsl:template match="/ | @* | node()">'
    + ' <xsl:copy>'
    + '   <xsl:apply-templates select="@* | node()"/>'
    + ' </xsl:copy>'
    + '</xsl:template>'
    + '</xsl:stylesheet>'
    ;
var
  xsl: IXMLDOMDocument;
begin
  xsl := CODOMDocument.Create;
  xsl.async := false;
  xsl.loadXML(Format(TransformCode, [sXPath, sNewTagName]));

  doc.loadXML(doc.transformNode(xsl));
end;
So kannst du den Code testen:

Delphi-Quellcode:
procedure TDemoForm.RenameButtonClick(Sender: TObject);
const
  SampleXML
    = '<root>'
    + ' <alt id="1"><subelement id="101"/></alt>'
    + ' <test id="10"><subelement id="1001"/></test>'
    + ' <alt id="2"><subelement id="201"/></alt>'
    + ' <test id="20">'
    + '   <alt id="3">DEMO</alt>'
    + '   <alt id="4"><subelement id="401"/></alt>'
    + ' </test>'
    + '</root>'
    ;
var
  doc: IXMLDOMDocument;
  xpath: string;
begin
  doc := CODOMDocument.Create;
  doc.async := false;

  // rename second top level occurrence
  doc.loadXML(SampleXML);
  xpath := '/*/alt[2]';
  RenameElements(doc, xpath, 'neu');
  ShowMessage(xpath + #13#13 + doc.xml);

  // rename all second level occurrences
  doc.loadXML(SampleXML);
  xpath := '/*/*/alt';
  RenameElements(doc, xpath, 'neu');
  ShowMessage(xpath + #13#13 + doc.xml);

  // rename all occurrences
  doc.loadXML(SampleXML);
  xpath := '//alt';
  RenameElements(doc, xpath, 'neu');
  ShowMessage(xpath + #13#13 + doc.xml);
end;
Grüße vom marabu

Aenogym 11. Jan 2006 16:51

Re: MSXML: NodeName ändern
 
danke marabu!
ich hab's im moment mit einer kombination aus CloneNode() und ReplaceNode() geschafft. ist zwar nicht ganz so schön, wie deine variante, aber funktioniert erstmal :)
mal sehen, ob ich das morgen ändere ;)

aeno


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 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