Wie bestimmten Knoten aus XML-Datei entfernen?
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:
Mit folgender Methode möchte ich nun einen bestimmten Knoten löschen:
<?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>
Delphi-Quellcode:
Dieser Methode möchte ich zwei verschiedentiefe XML-Knoten übergeben können:
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;
Delphi-Quellcode:
SelectedCDNode und SelectedTrackNode werden bei den SelectCell-Ereignissen der jeweiligen Grids gesetzt:
deleteNodeFromXMLFile(SelectedCDNode);
deleteNodeFromXMLFile(SelectedTrackNode);
Delphi-Quellcode:
die Methoden convertInttoCDNode bzw. convertInttoTrackNode sehen so aus:
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;
Delphi-Quellcode:
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.
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; 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 |
Re: Wie bestimmten Knoten aus XML-Datei entfernen?
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:
Delphi-Quellcode:
Deine XPATH Ausdrücke kannst du noch weiter vereinfachen, da deine Knoten je nach Typ immer auf der selben Ebene angesiedelt sind:
SelectedNode.parentNode.removeChild(SelectedNode);
Delphi-Quellcode:
Grüße vom marabu
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; |
Re: Wie bestimmten Knoten aus XML-Datei entfernen?
Super :thumb:
Danke, es funzt! Da wäre ich im Leben nicht drauf gekommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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