Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   wie komm ich nur an die Werte ? (https://www.delphipraxis.net/195517-wie-komm-ich-nur-die-werte.html)

Gege 6. Mär 2018 19:29

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:
<?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>
mein Ziel ist es einen Wert bei

<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:

 ( xmldoc:IXMLNode; )

xmldoc.ChildNodes.Nodes['Index'].ChildNodes['Var'].Attributes['Value'].NodeValue .. ??
funktioniert natürlich nicht .. hmm wie greif ich denn nur darauf zu
kann mir einer helfen ?

speichern ist dann kein problem .. mit xmldoc.SaveToFile

viele Grüße Gege

himitsu 6. Mär 2018 19:37

AW: wie komm ich nur an die Werte ?
 
Bei Google suchenXPath / Bei Google suchendelphi xml xpath, denn da kannst du nach dem
Delphi-Quellcode:
Node "Var", welcher ein Attribut Name="*ADRESSNR"
suchen/fragen

oder mit Index zugreifen, also alles Nodes "Var" auflisten, mit einer Schleife alle durchgehn und deren Attribute prüfen,

Gege 6. Mär 2018 19:47

AW: wie komm ich nur an die Werte ?
 
xpath .. ist das eine Komponente ?

Blup 7. Mär 2018 09:20

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');

Gege 7. Mär 2018 12:40

AW: wie komm ich nur an die Werte ?
 
ok kann ich mal testen ..

melde mich mit Ergebnis

danke schon mal

himitsu 7. Mär 2018 13:10

AW: wie komm ich nur an die Werte ?
 
Zitat:

Zitat von Gege (Beitrag 1395371)
xpath .. ist das eine Komponente ?

Wie wäre es, wenn du dir die ersten 2-3 Ergebnisse der verlinken Suchen ansiehst?
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';

Gege 7. Mär 2018 13:40

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

himitsu 7. Mär 2018 14:17

AW: wie komm ich nur an die Werte ?
 
Fällt dir bei meinem Code-Beispiel etwas auf?
>
Delphi-Quellcode:
DocumentElement
Wenn du direkt vom Dokument aus gehst, dann mußt du den Root-Knoten
Delphi-Quellcode:
<Document>
mit angeben.

Gege 7. Mär 2018 15:43

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

Gege 7. Mär 2018 17:44

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:
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;
dann passt das auch

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..

TiGü 8. Mär 2018 08:24

AW: wie komm ich nur an die Werte ?
 
Zitat:

Zitat von Gege (Beitrag 1395501)
@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..

Es ist schon irgendwo ziemlich daneben, nachzufragen was XPath ist, OBWOHL im Beitrag zuvor LINKS dazu eingearbeitet wurden und dann hinterher sich zu mokieren, dass man angeblich gegängelt wird, weil man nicht gegoogelt hat. Was ja so nicht in diesem Thread stattfand.

Gege 8. Mär 2018 09:53

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

himitsu 8. Mär 2018 09:58

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.

Gege 8. Mär 2018 10:17

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.

Gege 8. Mär 2018 11:58

AW: wie komm ich nur an die Werte ?
 
Zitat:

Zitat von Gege (Beitrag 1395368)
ich hab ein XML Dokument

Code:
<?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>
mein Ziel ist es einen Wert bei

<Var Name="*ADRESSNR" Value="71362" />

in zum Beispiel
<Var Name="*ADRESSNR" Value="08157" />

zu ändern ...
Code:

 ( xmldoc:IXMLNode; )

xmldoc.ChildNodes.Nodes['Index'].ChildNodes['Var'].Attributes['Value'].NodeValue .. ??
funktioniert natürlich nicht .. hmm wie greif ich denn nur darauf zu


die genaue Antwort ist

Code:
xmldocument1.ChildNodes['Document'].ChildNodes.Nodes['Index'].ChildNodes[6].Attributes['Value']:='08157';
falls es auch jemand braucht

viele Grüße
Gege

sko1 8. Mär 2018 13:42

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

Gege 8. Mär 2018 14:02

AW: wie komm ich nur an die Werte ?
 
Zitat:

Wer garantiert dass übermorgen noch ChildNodes[6] die Adressnummer ist?
weil ich diese xml immer selber als Vorlage öffne
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

himitsu 8. Mär 2018 14:06

AW: wie komm ich nur an die Werte ?
 
Zitat:

Zitat von sko1 (Beitrag 1395569)
Wäre da ebenfalls die Angabe des Namens '*ADRESSNR' sinnvoller?

Genau das ist eine der Stärken von XPath.

Ähnlich wie das Dateipfad im Explorer, aber mit mehr Möglichkeiten zum Suchen.
Delphi-Quellcode:
'Document/Index/Var[6]/attribute::Value'
der 7. "VAR"-Knoten, entsprechend dem
Delphi-Quellcode:
xmldocument1.ChildNodes['Document'].ChildNodes.Nodes['Index'].ChildNodes[6].Attributes['Value']

Delphi-Quellcode:
'Document/Index/Var[@Name="*ADRESSNR"]/attribute::Value'
der "VAR"-Knoten mit einem Attribut "Name"="*ADRESSNR"

Gege 8. Mär 2018 14:16

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 23:24 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