Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   [gelöst] XML Attribute - einfacher Zugriff (https://www.delphipraxis.net/189559-%5Bgeloest%5D-xml-attribute-einfacher-zugriff.html)

matashen 24. Jun 2016 10:16


[gelöst] XML Attribute - einfacher Zugriff
 
Hallo,

ich bekomme ein XML das ich in meinem Programm bearbeiten soll.

Das XML hat den Aufbau das in einem NODE die Attribute Name stehen und value.
Die Nodes haben alle den gleichen Namen DATA. Wie greife ich jetzt am einfachsten auf die Attribute zu ohne das ich jedes einzeln auswerten muss ob das Attribute Name das richtige ist.

Code:
<DATA name="val_masksizex" minv="1" maxv="2" value="460000" />
Ich habe gedacht ich könnte irgenwie über
Childnodes['Data'].Attributes
zugreifen, aber dann müsste ich ja hunderte von Nodes absuchen wo das antsprechende Attribut gesetzt ist, geht das auch einfacher? Oder wie mach ich das am besten?


Gruß Matthias

Der schöne Günther 24. Jun 2016 10:23

AW: XML Attribute - einfacher Zugriff
 
Ich verstehe das Problem nicht ganz. Dir geht es doch nur um das Attribut
Delphi-Quellcode:
value
, richtig? Klar musst du alle Knoten "DATA" durchgehen.

Wenn ich das hier:
Code:
<myDocument>
   <DATA name="val_masksizex" minv="1" maxv="2" value="460000" />
   <DATA name="val_masksizex" minv="1" maxv="2" value="42" />
   <DATA name="val_masksizex" minv="1" maxv="2" value="-99" />
</myDocument>
in mein
Delphi-Quellcode:
Memo1
einfüge, auf meinen
Delphi-Quellcode:
Button1
drücke erscheint in meinem
Delphi-Quellcode:
Memo2
das hier:
Code:
460000
42
-99
Das ist doch was du wolltest, oder?


Folgender Code:
Delphi-Quellcode:
procedure TForm8.Button1Click(Sender: TObject);
var
   rootNode:      IXMLNode;
   nodeIterator:   IXMLNode;
begin
   rootNode := LoadXMLData(Memo1.Text).DocumentElement;

   nodeIterator := rootNode.ChildNodes.First();
   while Assigned(nodeIterator) do begin
      if (nodeIterator.NodeName = 'DATA') then
         Memo2.Lines.Append( nodeIterator.Attributes['value'] );

      nodeIterator := nodeIterator.NextSibling();
   end;
end;

matashen 24. Jun 2016 10:27

AW: XML Attribute - einfacher Zugriff
 
schonmal danke für die schnelle Antwort,

nicht ganz getroffen,

in den DATA Nodes ist das Attribute Name jeweils anders

war evtl etwas unverständlich

Code:
 <DATA name="val_masksizex" minv="1" maxv="2" value="460000" />
      <DATA name="val_masksizey" minv="1" maxv="2" value="460000" />
      <DATA name="val_maxdistanceerror" minv="1" maxv="2" value="180" />
      <DATA name="val_operationmode" minv="1" maxv="2" value="0" />
am liebsten wär mir ein zugriff a la

meintext:=Childnodes['Data'].Attributes['Name=val_masksizex'].attributes['value'];
oder
Childnodes['Data'].Attributes['Name=val_masksizex'].attributes['value']:=meintext;

gibt's da eine Lösung?

Die nodes heissen alle Data, das Attribute Name existiert in jedem Node aber mit unterschiedlichen Namen.

Der schöne Günther 24. Jun 2016 11:03

AW: XML Attribute - einfacher Zugriff
 
Willst du denn nur zu einer handvoll bestimmten "Namen" die Werte haben? Dann kannst du doch einfach in einer Schleife durchgehen. Oder willst du alle Name/Werte-Paare haben und z.B. einer
Delphi-Quellcode:
TStringList
ablegen? Dann kannst du eigentlich genauso weiter durchlaufen und in jedem
Delphi-Quellcode:
while
-Durchgang das ablegen.

matashen 24. Jun 2016 11:08

AW: XML Attribute - einfacher Zugriff
 
Ich will das Attribut Value ändern in Abhängigkeit des Wertes von Attribute Name

Z.B. mal einfach so rausgetippt
und keine Ahnung wie ich das machen muss damit das funktioniert

Delphi-Quellcode:
function read_value(parameterstr:String):string;
begin;
result:=xmlfile.documentelement.ChildNodes('/Asys/Product/Datas/Data[@name="'+parameterstr+'"]');
end;

procedure Change_Value(parameterstr,newvalue:String);
begin;
xmlfile.documentelement.ChildNodes('/Asys/Product/Datas/Data[@name="'+parameterstr+'"]'):=newvalue;
end;

Damit will ich in die XML Struktur zugreifen um die Value auszulesen oder zu ändern

Der schöne Günther 24. Jun 2016 11:26

AW: XML Attribute - einfacher Zugriff
 
Ach sooo.

Dein "einfach mal so rausgetippt" ist doch schon deine Lösung: Mittels XPath den gewünschten Knoten finden. Im Beispiel dass dein Dokument so aussieht
Code:
<Asys>
   <Product>
      <Datas>
         <DATA name="val_masksizex" minv="1" maxv="2" value="460000" />
         <DATA name="val_masksizey" minv="1" maxv="2" value="460000" />
         <DATA name="val_maxdistanceerror" minv="1" maxv="2" value="180" />
         <DATA name="val_operationmode" minv="1" maxv="2" value="0" />    
      </Datas>
   </Product>
</Asys>
änderst du hiermit den Wert eines gewünschten Knotens einfach ab:
Delphi-Quellcode:
procedure TForm8.Button1Click(Sender: TObject);
var
   xmlDoc:         IXMLDocument;
   rootNode:      IXMLNode;
   wantedNode:      IXMLNode;
begin
   xmlDoc := LoadXMLData(Memo1.Text);

   rootNode := xmlDoc.DocumentElement;
   rootNode := TXpathHelper.SelectNode(rootNode, '/Asys/Product/Datas');

   wantedNode := TXPathHelper.SelectNode(rootNode, './DATA[@name="val_operationmode"]');
   wantedNode.Attributes['val_operationMode'] := '-99';

   memo2.Text := xmlDoc.DocumentElement.XML;
end;
Ich war so frei den "TXPathHelper" von hier zu nehmen ;-)

matashen 24. Jun 2016 11:30

AW: XML Attribute - einfacher Zugriff
 
OK Danke Günther,

dann hat bei meinem Denkansatz ja nur noch der Abschluss gefehlt.
(Herr lass Hirn regnen)

Ich glaub ich brech jetzt ab und gib mir ein Freibad - bei der Hitze arbeitet mein Hirn nimmermehr


nochmal Dankeschön und schönes Wochenende

8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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