![]() |
[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:
Ich habe gedacht ich könnte irgenwie über
<DATA name="val_masksizex" minv="1" maxv="2" value="460000" />
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 |
AW: XML Attribute - einfacher Zugriff
Ich verstehe das Problem nicht ganz. Dir geht es doch nur um das Attribut
Delphi-Quellcode:
, richtig? Klar musst du alle Knoten "DATA" durchgehen.
value
Wenn ich das hier:
Code:
in mein
<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>
Delphi-Quellcode:
einfüge, auf meinen
Memo1
Delphi-Quellcode:
drücke erscheint in meinem
Button1
Delphi-Quellcode:
das hier:
Memo2
Code:
Das ist doch was du wolltest, oder?
460000
42 -99 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; |
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:
am liebsten wär mir ein zugriff a la
<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" /> 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. |
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:
ablegen? Dann kannst du eigentlich genauso weiter durchlaufen und in jedem
TStringList
Delphi-Quellcode:
-Durchgang das ablegen.
while
|
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 |
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:
änderst du hiermit den Wert eines gewünschten Knotens einfach ab:
<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>
Delphi-Quellcode:
Ich war so frei den "TXPathHelper"
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; ![]() |
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 07:24 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