![]() |
wie komm ich nur an die Werte ?
Hallo Leute,
ich hab mal wieder ein Problem und steh gerade auf den Schlauch .. ich hab ein XML Dokument
Code:
mein Ziel ist es einen Wert bei
<?xml version="1.0" encoding="iso-8859-1"?>
<Document> <Doctype>PDF</Doctype> <Index> <Var Name="*FIRMA" Value="F61" /> <Var Name="*BELEGART" Value="VK" /> <Var Name="*BELEGKREIS" Value="LF" /> <Var Name="*BELEGNR" Value="0845578" /> <Var Name="*BELEGDATUM" Value="2018-02-22" /> <Var Name="*KONTOTYP" Value="D" /> <Var Name="*ADRESSNR" Value="71362" /> </Index> </Document> <Var Name="*ADRESSNR" Value="71362" /> in zum Beispiel <Var Name="*ADRESSNR" Value="08157" /> zu ändern und dann alles wieder abzuspeichern. Ich habe mit XMLDocument geladen und komme auch z.b auf den Doctype aber auf das Attribut Value von Var habe ich meine Probleme..
Code:
funktioniert natürlich nicht .. hmm wie greif ich denn nur darauf zu ( xmldoc:IXMLNode; ) xmldoc.ChildNodes.Nodes['Index'].ChildNodes['Var'].Attributes['Value'].NodeValue .. ?? kann mir einer helfen ? speichern ist dann kein problem .. mit xmldoc.SaveToFile viele Grüße Gege |
AW: wie komm ich nur an die Werte ?
![]() ![]()
Delphi-Quellcode:
suchen/fragen
Node "Var", welcher ein Attribut Name="*ADRESSNR"
oder mit Index zugreifen, also alles Nodes "Var" auflisten, mit einer Schleife alle durchgehn und deren Attribute prüfen, |
AW: wie komm ich nur an die Werte ?
xpath .. ist das eine Komponente ?
|
AW: wie komm ich nur an die Werte ?
Nicht getestet:
Delphi-Quellcode:
procedure SetIndexValue(ADoc: IXMLDocument; const AIndex, AValue: string);
var IndexNode, Node: IXmlNode; i: Integer; begin IndexNode := ADoc.ChildNodes.Nodes['Index']; {Suchen und Ändern} for i := 0 to IndexNode.ChildNodes.Count - 1 do begin Node := IndexNode.ChildNodes[i]; if (Node.NodeName = 'Var') and (Node.Attributes['Name'] = AIndex) then begin Node.Attributes['Value'] := AValue; Exit; end; end; {nicht gefunden, neu anlegen} Node := IndexNode.AddChild(AIndex); Node.Attributes['Name'] := AIndex; Node.Attributes['Value'] := AValue; end; SetIndexValue(xmlDox, '*ADRESSNR', '08157'); |
AW: wie komm ich nur an die Werte ?
ok kann ich mal testen ..
melde mich mit Ergebnis danke schon mal |
AW: wie komm ich nur an die Werte ?
Zitat:
1.) was es ist 2.) wie man es im Delphi nutzt in etwa so
Delphi-Quellcode:
XMLDocument.DocumentElement.selectSingleNode('Index/Var[@Name="*ADRESSNR"]/attribute::Value').Value := '123456';
|
AW: wie komm ich nur an die Werte ?
hab es gerade probiert ..
leider kommt das er den Knoten Index nicht finden konnte ? kommt auch wenn ich z.B. showmessage(xmldocument1.ChildNodes['Index'].Nodename); mache |
AW: wie komm ich nur an die Werte ?
Fällt dir bei meinem Code-Beispiel etwas auf?
>
Delphi-Quellcode:
Wenn du direkt vom Dokument aus gehst, dann mußt du den Root-Knoten
DocumentElement
Delphi-Quellcode:
mit angeben.
<Document>
|
AW: wie komm ich nur an die Werte ?
Hallo Himitsu
Deine Version hatte ich erst danach getestet .. Hatte Deine Antwort in den Moment wo ich Blup geantwortet habe noch nicht gesehen. habe Dein's aber auch getestet da bekomme ich nach XMLDocument1.DocumentElement. aber nicht selectSingleNode vorgeschlagen .. also kommt da schon Fehler .. vg Gege |
AW: wie komm ich nur an die Werte ?
So jetzt hab ich es gelöst..
mit Blup seiner Variante .. Danke Blup Variante himitsu sieht zwar irgendwie einfacher aus .. aber leider bekommt man bzw. hab ich es nicht gefunden genauere Infos dazu. musste nur wie himitsu es erwähnte natürlich den rootknoten "Document" mit angeben die Procedure sieht jetzt so aus ..
Code:
dann passt das auch
procedure SetIndexValue(ADoc: IXMLDocument; const AIndex, AValue: string);
var IndexNode, Node: IXmlNode; i: Integer; begin IndexNode := ADoc.ChildNodes['Document'].ChildNodes.Nodes['Index']; {Suchen und Ändern} for i := 0 to IndexNode.ChildNodes.Count - 1 do begin Node := IndexNode.ChildNodes[i]; if (Node.NodeName = 'Var') and (Node.Attributes['Name'] = AIndex) then begin Node.Attributes['Value'] := AValue; Exit; end; end; {nicht gefunden, neu anlegen} Node := IndexNode.AddChild(AIndex); Node.Attributes['Name'] := AIndex; Node.Attributes['Value'] := AValue; end; vielen Dank .. Blup & himitsu @himitsu googeln tu ich immer vorher .. nur wenn ich nach Stunden keine Lösung finde frag ich mal in ein Forum nach .. natürlich nicht um nur auf Google hingewiesen zu werden nur mal Rande mit erwähnt.. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 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