Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.
Seite 1 von 2  1 2      

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