AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML XML fehlende Nodes automatisiert erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

XML fehlende Nodes automatisiert erstellen

Ein Thema von matashen · begonnen am 29. Sep 2016 · letzter Beitrag vom 29. Sep 2016
Antwort Antwort
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

XML fehlende Nodes automatisiert erstellen

  Alt 29. Sep 2016, 09:46
Hallo,

der Titel sagts schon,

ich soll eine bestehende Default.xml als neue Ziel.XML speichern und dabei einige Werte anpassen bzw. es fehlen Nodes die dann auch erzeugt werden müssen. Da das XML etwas größer ist wollte ich jetzt nicht jeden Knoten per Hand anlegen.

Zum auslesen verwende ich den TXPathhelper den ich hier im Forum bekommen habe, funktioniert soweit ganz gut.

Mein Problem: Wie erzeuge ich automatisch Nodes die in meiner bisherigen XML Struktur nicht existieren
Aufruf stell ich mir so vor

Delphi-Quellcode:
var neuerNode:IXmlNode;
.
.
neuerNode:=TXPathhelper.selectnode('/ersterNode/nocheiner/nasowas');
if neuerNode=Nil then neuernode:=TXPathHelper.CreateNodepath('/ersterNode/nocheiner/nasowas');
wie realisier ich sowas?

Der XPathhelper den ich benutze enthält folgenden Code
Delphi-Quellcode:
class function TXPathHelper.SelectNode(xnRoot: IXmlNode; const nodePath: WideString): IXmlNode;
    var
       intfSelect : IDomNodeSelect;
       dnResult : IDomNode;
       intfDocAccess : IXmlDocumentAccess;
       doc: TXmlDocument;
    begin

       Result := nil;

       if
          not Assigned(xnRoot)
          or not Supports(xnRoot.DOMNode, IDomNodeSelect, intfSelect)
       then
          Exit;

       dnResult := intfSelect.selectNode(nodePath);

       if Assigned(dnResult) then begin
          if Supports(xnRoot.OwnerDocument, IXmlDocumentAccess, intfDocAccess) then
             doc := intfDocAccess.DocumentObject
          else
             doc := nil;

          Result := TXmlNode.Create(dnResult, nil, doc);
       end;

    end;
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: XML fehlende Nodes automatisiert erstellen

  Alt 29. Sep 2016, 10:31
Eine IXMLNode hat die Methode AddChild(..) Beispiel:
Delphi-Quellcode:
procedure TForm17.Button1Click(Sender: TObject);
const
   nodePath = '/ersterNode/nocheiner/nasowas';
var
   asDoc:      IXMLDocument;
   asNode:      IXMLNode;
   newNode:   IXMLNode;
begin
   asDoc := LoadXMLData(Memo1.Text);
   asNode := TXpathHelper.SelectNode(asDoc.DocumentElement, nodePath);
   newNode := asNode.AddChild('neuerKnoten');
   newNode.Attributes['someAttribute'] := 'derp';

   Memo2.Text := asDoc.XML.Text;
end;
Memo1:
Code:
<ersterNode>
 <nocheiner>
  <nasowas />
 </nocheiner>
</ersterNode>
Memo2:
Code:
<ersterNode>
   <nocheiner>
      <nasowas><neuerKnoten someAttribute="derp"/></nasowas>
   </nocheiner>
</ersterNode>
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: XML fehlende Nodes automatisiert erstellen

  Alt 29. Sep 2016, 10:36
Hi Günther,

das kenn ich selber - einen einzelnen Node hinzufügen,

ist aber nicht das worum ich gefragt habe ich hätte gernde die Erzeugung des gesamten paths aller Nodes die da enthalten sind. Und eben mit einem Befehl.

geht sowas?

Gruß Matthias
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: XML fehlende Nodes automatisiert erstellen

  Alt 29. Sep 2016, 10:54
Ach jetzt verstehe ich - Du möchtest mittels XPath eine Hierarchie anlegen. Also z.B. in einem komplett leeren XML mit einem Befehl einen Knoten mit der Adresse /ersterNode/nocheiner/nasowas erstellen sodass die Oberknoten mit erstellt werden?

Ich kenne da nichts vollautomatisches, vor allem nicht mit XPath (wie sollte das gehen?) Aber ist ja auch kein Hexenwerk in deinem speziellen Fall das selbst zu machen...
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: XML fehlende Nodes automatisiert erstellen

  Alt 29. Sep 2016, 13:19
... und genau da häng ich grad mit meinem Gehirn fest.

Ich frag ja jetzt den vorhandenen Paramter mittels XPath ab,

das heist ich bekomm nil wenn der Knoten nicht existiert

dann möcht ich den erstellen, aber eben mit dem übergebenen String des XPath

Im prinzip sollte dann die Funktion so arbeiten


Function CreateNodepath(rootnode:IXMLNOde; nodepath:String):IXMLNode;
begin;
letzten Node extrahieren
dann mittels XPath prüfen ob parentNode existiert
wenn ja dann addchild(letzter Node)
wenn nein dann Createnodepath rekursiv aufrufen
neuen Node zurück geben
end;


so in etwa, aber wie ich das dann in Code Umsetze bekomm ich die Gehirnwindung nicht ganz zusammen. Vor allem wie zerlege ich den String des XPath um die Nodes dann zu erstellen. Gibts da passende Stringfunktionen die vom StringEnde bis gewähltes Zeichen einen String wegschneiden können?? Denn ich denke so in der art brauch ich was


hab jetzt mal versucht was zu schreiben, noch ungetestet ich wollte zuerst noch euch drüber gucken lassen

Delphi-Quellcode:
   class function TXPathhelper.CreateNode(xnRoot: IXMLNode; const nodepath: WideString):IXmlNode;
      var a,newpath,newchild:String;
          i:Integer;
          wantednode:IXMLNode;
    begin
       a:=nodepath;
       i:=length(a);
       while (a[i]<>'/') or (i>0) do dec(i);
       if i>0 then begin; //was gefunden dann extrahieren und XPath anwenden
        newpath:=copy(nodepath,1,i-1);
        newchild:=copy(nodepath,i+1,length(nodepath)-i);
        wantednode:=TXPathhelper.SelectNode(xnroot,newpath);
        if wantednode<>nil then begin;
                                xnroot.AddChild(newchild);
                                result:=TXPathhelper.SelectNode(xnroot,nodepath);
                            end
                           else result:=TXPathhelper.CreateNode(xnroot,newpath);

       end;
    end;
Matthias
Das Leben ist eines der härtesten.

Geändert von matashen (29. Sep 2016 um 13:44 Uhr)
  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 05:44 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