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