![]() |
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.. |
AW: wie komm ich nur an die Werte ?
Zitat:
|
AW: wie komm ich nur an die Werte ?
Hallo TiGü
hast Du mal die Links angeklickt ? klar bei wiki steht das es eine Sprache ist und dann findet man viele links mit Usern die auch Probleme haben im Bezug auf ganz andere Dinge und man kann wieder viele Stunden vertreiben um trotzdem nicht ans Ziel zu kommen. Ich war auch davon ausgegangen das so ein Forum nicht nur ein Ersatz und Hilfestellung zu Google sein soll. War kein mokieren sondern nur ein Hinweis das es nicht immer die beste Antwort sein könnte. Er hat mir mit einen Hinweis ja auch weiter geholfen. mfg Gege |
AW: wie komm ich nur an die Werte ?
Die Syntax vom XPath ist recht einfach und überall gleich,
aber je nach Version und verwendeter Schnittstelle (Objektkapselung im Delphi oder eine der verschiedenen Interfaces) unterscheiden sich die Namen Methoden/Property und wo sie sich jeweils verstecken, das hab ich nunmal nicht alles im Kopf. Darum auch der Link mit (hoffentlich" passenden Suchworten, damit sich jemand das für ihn passende Interface raussuchen kann. |
AW: wie komm ich nur an die Werte ?
Hi himitsu,
ich hab zwar eine Lösung aber im Prinzip bin ich immer noch nicht schlauer was die Verwendung von XPath in Delphi angeht wie beschrieben bekomme ich bei selectSingleNode ja schon Fehler .. da muss ja irgendwo vorher etwas anders eingestellt werden .. und ja ich habe mir über die links alles möglich durchgelesen aber gerade den Part eben nicht finden können. Nur auch solche Beispiele wie von Dir deswegen dachte ich es gibt evtl. eine andere Komponente als die IXMLdocument Aber ich kann mit der jetzigen Lösung leben .. in diesen speziellen Fall kann ich es sogar verkürzen und brauch die Procedure nicht da die Quell XML-Datei immer die gleiche ist deswegen brauch ich nicht suchen sondern kann per Index immer gleiche zugreifen. |
AW: wie komm ich nur an die Werte ?
Zitat:
die genaue Antwort ist
Code:
falls es auch jemand braucht
xmldocument1.ChildNodes['Document'].ChildNodes.Nodes['Index'].ChildNodes[6].Attributes['Value']:='08157';
viele Grüße Gege |
AW: wie komm ich nur an die Werte ?
Delphi-Quellcode:
xmldocument1.ChildNodes['Document'].ChildNodes.Nodes['Index'].ChildNodes[6].Attributes['Value']:='08157';
Falls es jemand braucht sollte dann bis hinten konsequent "benamst" werden! Wer garantiert dass übermorgen noch ChildNodes[6] die Adressnummer ist? Wäre da ebenfalls die Angabe des Namens '*ADRESSNR' sinnvoller? Ciao Stefan |
AW: wie komm ich nur an die Werte ?
Zitat:
und jeweils geändert nur unter anderen Namen abspeichere.. Hintergrund ist ich bekomme PDF Files in denen im Namen die '*ADRESSNR' steht und ich unter gleichen Namen die XML Datei dazu erzeugen muss (Für ein Archivsystem) Sicher die einfachste Methode ist die XML immer neu einfach zusammenzubauen aber da es diese Funktionen nun mal gibt wollte ich sie auch nutzen |
AW: wie komm ich nur an die Werte ?
Zitat:
Ähnlich wie das Dateipfad im Explorer, aber mit mehr Möglichkeiten zum Suchen.
Delphi-Quellcode:
der 7. "VAR"-Knoten, entsprechend dem
'Document/Index/Var[6]/attribute::Value'
Delphi-Quellcode:
xmldocument1.ChildNodes['Document'].ChildNodes.Nodes['Index'].ChildNodes[6].Attributes['Value']
Delphi-Quellcode:
der "VAR"-Knoten mit einem Attribut "Name"="*ADRESSNR"
'Document/Index/Var[@Name="*ADRESSNR"]/attribute::Value'
|
AW: wie komm ich nur an die Werte ?
das mag ja richtig sein ..
wenn mir aber NIEMAND sagen kann wie ich das mit XPath machen kann nehm ich die Variante die mir wenigstens jemand sagt und die auch funktioniert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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