Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi XML-Knoten löschen! (https://www.delphipraxis.net/56249-xml-knoten-loeschen.html)

salem01 2. Nov 2005 21:10


XML-Knoten löschen!
 
Hi zusammen,

ich habe ein Problem mit dem Löschen eines XML-Tag mit seinen unter Tags!.
Hier ist mal der Quellcode:-
Delphi-Quellcode:
 
function ProbandLoeschen(const probandenXML, probandID : string) : string;
var

  XMLDOMProbanden : IXMLDOMDocument;
  XMLDOMProbandNode : IXMLDOMNode;

begin

  XMLDOMProbanden := CoDOMDocument40.Create;
  XMLDOMProbanden.async := false;
  XMLDOMProbanden.loadXML(probandenXML);
    //bestimmer der ID des jeweiligen probanden
    XMLDOMProbandNode := XMLDOMProbanden.selectSingleNode ('//proband[name="'+ probandID +'"]');

    if(NOT(XMLDOMProbandNode = NIL)) then
    begin //löschen des probanden anhand seiner ermittelten ID
      XMLDOMProbanden.selectSingleNode('/probanden').removeChild(XMLDOMProbandNode);
    end;
  result := XMLDOMProbanden.xml;
end;
diese Funktion wird wie folgend in einer andere Unit aufgerufen:

Delphi-Quellcode:
      //Proband löschen (Button von der XSL-Datei)
     if(funktion = 'probandloeschen') then
      begin
      CreateFileIfNotExist(getDataPath('xml\probanden.xml'), xorKey);
      xmlString:= checkedFileToString(getDataPath('xml\probanden.xml'), xorKey);
      if xmlString = '' then
       begin
        result:= fileToString(getDataPath('error\manipulated.html'));
        exit;
       end;
      with RequestInfo.Params do
       xmlString:= ProbandLoeschen(xmlString, RequestInfo.Params.Values['probandID']);
      checkedStringToFile(xmlString, getDataPath('xml\probanden.xml'), xorKey);
      result:= CreateHTMLProbandenverwaltung(xmlString, xslString);
      exit;
     end;
Die XML-datei der Probanden sieht folgendermassen aus:

Delphi-Quellcode:
<probanden>
   <proband>
      <id>1</id>
      <name>Mustermann</name>
      <vorname>Alex</vorname>
                    .......
      <attribut typ="nc">
         <beschreibung>Name</beschreibung>
         <def_wert>Mustermann</def_wert>
      </attribut>
      <attribut typ="nc">
         <beschreibung>Vorname</beschreibung>
         <def_wert>Alex</def_wert>
      </attribut>
           ......
         </proband>
...........
</probanden>
ich kann diesen probanden-knoten aber irgendwie nicht löschen!!.
liegt es vielleicht an der Anzahl der unter-Tags?? denn ich habe eine Fuktion zum attribute löschen, die fast genauso aussieht, aber die geht!! :gruebel: :gruebel: .
kann mir vielleicht jemand weiterhelfen?.
LG.

marabu 2. Nov 2005 21:41

Re: XML-Knoten löschen!
 
Hi.

Dein XPATH Ausdruck ist nicht in Ordnung.

Delphi-Quellcode:
var
  xp: string;
begin
  ...
  xp := Format('//proband[id="%s"]', [probandID]);
  XMLDOMProbandNode := XMLDOMProbanden.selectSingleNode (xp);
  ...
end;
Ein Beispiel zum Löschen eines Knoten findest du hier: klick

Grüße vom marabu

salem01 2. Nov 2005 22:32

Re: XML-Knoten löschen!
 
danke, habe es ausprobiert und leider gleiche problem :cry: .
ich habe aber eine variable definiert, der den wert '1' zugewiesen und habe den eintrag in meiner liste mit der ID = 1 und es geht!.
ich glaube er schafft es nicht die richtige ID zu ermitteln :( .
könnte es vielleicht an den ermittelten daten vom server liegen, dass er die in einem anderen format übermittelt?!?!
LG

MathiasSimmack 2. Nov 2005 22:36

Re: XML-Knoten löschen!
 
Das musst du doch wissen, wenn du dir mal den XML-Code der Datei vom Server anzeigen lässt :stupid:

salem01 2. Nov 2005 22:43

Re: XML-Knoten löschen!
 
das problem ich habe den code übernommen und möchte es erweitern, bin auch ziemlich neu in delphi bzw. XML :oops: .

marabu 3. Nov 2005 10:22

Re: XML-Knoten löschen!
 
Hi salem01.

Ich habe deinen Code ein wenig umgeschrieben - erkennst du ihn wieder?

Delphi-Quellcode:
function ProbandLoeschen(const markup, id: string) : string;
var
  n: IXMLDOMNode;
begin
  with CoDOMDocument.Create do
  begin
    async := false;
    if loadXML(markup) then
    begin
      n := selectSingleNode(Format('//proband[id="%s"]', [id]));
      if Assigned(n) then
        n.parentNode.removeChild(n);
      Result := xml;
    end else
      Result := markup;
  end;
end;
Universell einsetzbar ist der Code aber nicht. Besser wäre der folgende Code, aber dann müsstest du die Aufrufe anpassen:

Delphi-Quellcode:
function DropNodes(markup, xPath: string): string;
var
  nl: IXMLDOMNodeList;
  n: IXMLDOMNode;
  i: integer;
begin
  with CoDomDocument.Create do
  begin
    async := false;
    if loadXML(markup) then
    begin
      nl := selectNodes(xPath);
      for i := Pred(nl.length) downto 0 do
      begin
        n := nl.item[i];
        n.parentNode.removeChild(n);
      end;
      Result := xml;
    end else
      Result := markup;
  end;
end;

procedure TDemoForm.TestButtonClick(Sender: TObject);
var
  xPath: string;
begin
  xPath := Format('//proband[id="%s"]', [RequestInfo.Params.Values['probandID']]);
  xmlString:= DropNodes(xmlString, xPath);
end;
Du solltest deinen Code mal mit break points ausführen und dir die Inhalte der Variablen anschauen - vielleicht steht ja was anderes drin als du denkst.

Grüße vom marabu

salem01 3. Nov 2005 23:30

Re: XML-Knoten löschen!
 
Danke marabu,

es funktioniert jetzt, lag nicht am delphi teil, sondern am java-script in der xsl-datei :roll: !.

aber nochmal danke :thumb:
LG.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz