![]() |
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 |
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:
So kannst du den Code testen:
// 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;
Delphi-Quellcode:
Grüße vom marabu
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; |
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