AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Wie bestimmten Knoten aus XML-Datei entfernen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie bestimmten Knoten aus XML-Datei entfernen?

Ein Thema von toko · begonnen am 22. Jun 2005 · letzter Beitrag vom 23. Jun 2005
Antwort Antwort
toko

Registriert seit: 19. Apr 2005
40 Beiträge
 
#1

Wie bestimmten Knoten aus XML-Datei entfernen?

  Alt 22. Jun 2005, 23:18
Hallo,

ich habe mal eine kurze Frage, wahrscheinlich ist es nur eine Kleinigkeit, die ich nicht beachte.
Ich schildere es aber etwas genauer um Missverständnisse auszuschließen.

Ich habe diese XML-Datei, vielleicht ist die ja noch bekannt:
XML-Code:
<?xml version="1.0"?>
<cdorganizer>
   <cd id="1" titel="g testcd1" interpret="testinterpret1" genre="genre1">
      <track id="1" titel="e testtrack1" interpret="testinterpret1" dauer="11:11:11"/>
      <track id="2" titel="d testtrack2" interpret="testinterpret2" dauer="11:11:12"/>
      <track id="3" titel="c testtrack3" interpret="testinterpret3" dauer="11:11:13"/>
      <track id="4" titel="b testtrack4" interpret="testinterpret4" dauer="11:11:14"/>
      <track id="5" titel="a testtrack5" interpret="testinterpret5" dauer="11:11:15"/>
   </cd>
   <cd id="2" titel="f testcd2" interpret="testinterpret2" genre="genre2">
   </cd>
   <cd id="3" titel="e testcd3" interpret="testinterpret3" genre="genre3">
   </cd>
   <cd id="4" titel="d testcd4" interpret="testinterpret4" genre="genre4">
   </cd>
   <cd id="5" titel="c testcd5" interpret="testinterpret5" genre="genre5">
   </cd>
   <cd id="6" titel="b testcd6" interpret="testinterpret6" genre="genre6">
   </cd>
   <cd id="7" titel="a testcd7" interpret="testinterpret7" genre="genre7">
   </cd>
</cdorganizer>
Mit folgender Methode möchte ich nun einen bestimmten Knoten löschen:
Delphi-Quellcode:
procedure TfrmMain.deleteNodeFromXMLFile(SelectedNode: IXMLDOMNode);
begin
  if IsEntrySelected then begin
    //ShowMessage(SelectedNode.text); //Ausgabe1
    xmlDoc.removeChild(SelectedNode);
    IsEntrySelected := False;
    importXMLDatatostrgrdCDList;
  end else begin
      MessageDlg('Es ist kein Eintrag ausgewählt!'+ #13#10 + #13#10
        +'Um einen Eintrag zu löschen, klicken Sie diesen bitte an!', mtInformation, [mbOK], 0);
  end;
end;
Dieser Methode möchte ich zwei verschiedentiefe XML-Knoten übergeben können:
Delphi-Quellcode:
deleteNodeFromXMLFile(SelectedCDNode);

deleteNodeFromXMLFile(SelectedTrackNode);
SelectedCDNode und SelectedTrackNode werden bei den SelectCell-Ereignissen der jeweiligen Grids gesetzt:
Delphi-Quellcode:
procedure TfrmMain.strgrdCDListSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
var
  SelectedCDID: integer;
begin
    ...
    SelectedCDID := StrToInt(strgrdCDList.Cells[0,ARow]);
    SelectedCDNode := convertInttoCDNode(SelectedCDID);
    GlobSelectedCDID := SelectedCDID;
    ...
end;

procedure TfrmMain.strgrdTrackListSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
var
  SelectedTrackID: Integer;
begin
    ...
    SelectedTrackID := StrToInt(strgrdCDList.Cells[0,ARow]);
    SelectedTrackNode := convertInttoTrackNode(GlobSelectedCDID, SelectedTrackID);
    ...
end;
die Methoden convertInttoCDNode bzw. convertInttoTrackNode sehen so aus:
Delphi-Quellcode:
function TfrmMain.convertInttoCDNode(CDID: Integer): IXMLDOMNode;
var
  ThisSelectedNode: IXMLDOMNode;
begin
    ThisSelectedNode := xmlDoc.selectSingleNode('/cdorganizer/cd[@id="'+ IntToStr(CDID) +'"]');
     { TODO : selectedcdnode und thisselectednode refactoren }
    //ShowMessage('cd[@id="'+ IntToStr(CDID) +'"]'); //Ausgabe2
    Result := ThisSelectedNode;
end;

function TfrmMain.convertInttoTrackNode(CDID, TrackID: Integer): IXMLDOMNode;
var
  ThisSelectedNode: IXMLDOMNode;
begin
    ThisSelectedNode := xmlDoc.selectSingleNode('/cdorganizer/cd[@id="'+ IntToStr(CDID) +'"]/track[@id="'+ IntToStr(TrackID) +'"]');
    //ShowMessage('cd[@id="'+ IntToStr(CDID) +'"]/track[@id="'+ IntToStr(TrackID) +'"]'); //Ausgabe3
    Result := ThisSelectedNode;
end;
Bei Ausgabe 2 und 3 bekomme ich vernünftige Werte z.B. 'cd[@id="1"]' um die erste CD oder 'cd[@id="1"]/track[@id="1"]' um den ersten Track, der ersten CD löschen zu können.

Ausgabe1 jedoch ist leer. Aber hinter SelectedNode befindet sich ein Pointer.
Habe ich was bei der Knotenzuweisung falsch gemacht? Wenn ích die Geschicht mit XPath verstanden habe, müsste das doch hinhauen, oder? Kann mir jemand helfen?

Gruß Toko
  Mit Zitat antworten Zitat
marabu

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

Re: Wie bestimmten Knoten aus XML-Datei entfernen?

  Alt 23. Jun 2005, 07:18
Hallo ToKo,

Ausgabe1 muss bei dir leer sein, da deine Elemente keine Textknoten besitzen. Das Löschen mit xmlDoc.removeChild() dürfte nicht funktionieren, da die Methode nur einen direkt untergeordneten Knoten entfernen kann. Mach es besser so:

SelectedNode.parentNode.removeChild(SelectedNode); Deine XPATH Ausdrücke kannst du noch weiter vereinfachen, da deine Knoten je nach Typ immer auf der selben Ebene angesiedelt sind:

Delphi-Quellcode:
function TfrmMain.DiskNode(diskID: integer): IXMLDOMNode;
var
  xp: string;
begin
  if Assigned(xmlDoc) then begin
    xp := Format('//cd[@id="%d"]', [diskID]);
    Result := xmlDoc.selectSingleNode(xp);
  end
  else Result := nil;
end;

function TfrmMain.TrackNode(diskNode: IXMLDOMNode; trackID: integer): IXMLDOMNode;
var
  xp: string;
begin
  if Assigned(diskNode) then begin
    xp := Format('track[@id="%d"]', [id]);
    Result := diskNode.selectSingleNode(xp);
  end
  else Result := nil;
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
toko

Registriert seit: 19. Apr 2005
40 Beiträge
 
#3

Re: Wie bestimmten Knoten aus XML-Datei entfernen?

  Alt 23. Jun 2005, 22:29
Super

Danke, es funzt! Da wäre ich im Leben nicht drauf gekommen.
  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 12:23 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