AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MSXML: NodeName ändern

Ein Thema von Aenogym · begonnen am 11. Jan 2006 · letzter Beitrag vom 11. Jan 2006
Antwort Antwort
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#1

MSXML: NodeName ändern

  Alt 11. Jan 2006, 08:52
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
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
marabu

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

Re: MSXML: NodeName ändern

  Alt 11. Jan 2006, 11:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: MSXML: NodeName ändern

  Alt 11. Jan 2006, 17:51
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
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:29 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