Einzelnen Beitrag anzeigen

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