Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Mehrere gleichnamige Elemente (https://www.delphipraxis.net/108150-mehrere-gleichnamige-elemente.html)

dominikkv 7. Feb 2008 20:43


Mehrere gleichnamige Elemente
 
Hi

ich hab nen XML-File welches ich auslesen möchte.
Ich verwende dazu die XMLLib von Mütze1

Ich hab nun eine XML-Datei die mehrere gleichnamige Elemente hat.
Leider hab ich kein Plan wie ich die (gezielt) auslesen kann.
Hier erstmal ein Ausschnitt der XML: (Striche am Anfang zur orientation)
Delphi-Quellcode:
- <form name="BILLTO">
  - <element name="BILLTO_STREET_1" type="text" caption="Straße/Hausnr.:">
      <![CDATA[ Brunfels-Str. 8  ]]>
    </element>
  - <element name="BILLTO_POSTCODE" type="text" caption="PLZ:">
      <![CDATA[ 79495  ]]>
    </element>
  - <element name="BILLTO_CITY" type="text" caption="Ort:">
      <![CDATA[ Neuburg ]]>
    </element>
Auf das erste Element kann ich so zugreifen:
Delphi-Quellcode:
Lib.root.getNode('formvalues/form/element').Value.AsString
Mein Ziel: die Elemente anhand des Attribut name unterscheiden und drauf zugreifen.
Beispiel:
Delphi-Quellcode:
Lib.root.getNode('formvalues/form').NodeByAttribut('name', 'BILLTO_POSTCODE').Value.AsString
Geht sowas in der art?
Hoffe ihr versteht was ich meine^^

mfg.Dominik

Muetze1 7. Feb 2008 21:00

Re: Mehrere gleichnamige Elemente
 
Zitat:

Zitat von dominikkv
Ich verwende dazu die XMLLib von Mütze1

Frag mich doch direkt, ich glaube nicht das sich hier viele mit der Lib auskennen...

Zitat:

Zitat von dominikkv
Ich hab nun eine XML-Datei die mehrere gleichnamige Elemente hat.
Leider hab ich kein Plan wie ich die (gezielt) auslesen kann.

Hole dir einfach den Knoten, der die Elemente als Kinder hat. Dieser Knoten hat eine Eigenschaft Nodes, welche die Unterknoten enthält. Dazu gibt es dann die Untereigenschaft Nodes[], welche die XMLKnoten enthält und eine Eigenschaft Count, welche die Anzahl der Elemente in der Liste wiedergibt (also die Anzahl der Knoten unter dem Element).

Ein Beispiel einfach durch die gesamte Liste zu iterieren:
Delphi-Quellcode:
var
  lFormNode, lElement: TXMLNode;
  i: Integer;
begin
  lFormNode := Lib.GetNodeFromPath('formvalues/form');

    // Knoten gefunden?
  if assigned(lFormNode) and lFormNode.HasChildren then
  begin
    for i := 0 to pred(lFormNode.Nodes.Count) do
    begin
      lElement := lFormNode.Nodes[i];

      ShowMessage(lElement.Value.AsString);
    end;
  end;
end;
(Ab BDS2006 besteht natürlich auch die Möglichkeit das ganze mit
Delphi-Quellcode:
for lElement in lFormNode.Nodes do
möglich)

So, da du nun hier gleiche Knotennamen hast und du sie nur anhand der Attributewerte unterscheiden kannst, kann ich mir auch vorstellen, dass du einen bestimmten Knoten ermitteln willst, in dem du sagst, was das Attribut "name" für ein Wert haben sollte. Dann kannst du es auch so machen:

Delphi-Quellcode:
var
  lFormNode, lElement: TXMLNode;
  i: Integer;
begin
  lFormNode := Lib.GetNodeFromPath('formvalues/form');

    // Knoten gefunden?
  if assigned(lFormNode) and lFormNode.HasChildren then
  begin
    lElement := lFormNode.Nodes.GetNodeByAttributeValue('element', 'name', 'BILLTO_STREET_1');

    if assigned(lElement) then
      ShowMessage('Street 1: ' + lElement.Value.AsString)
    else
      ShowMessage('Street 1: <none>');
  end;
end;
Die Dokumentation für die Library ist unter anderem hier zu finden.

Wenn weitere Fragen sind, poste sie hier...

/PS: Ja ich weiß, dass die Benennung Nodes.Nodes[] doof bis dumm ist, aber es ist leider so historisch gewachsen. Durch die Default Eigenschaft fällt es in Delphi nicht so auf, aber z.B. im C++Builder fällt es massiv auf, da dort die Default Eigeschaften nicht verfügbar/nutzbar sind. Ich durfte mir von manchen Nutzern schon entsprechende Kommentare anhören, aber leider ist es nun nicht mehr groß änderbar.

dominikkv 7. Feb 2008 21:13

Re: Mehrere gleichnamige Elemente
 
genial... du hast mir den Abend gerettet :mrgreen:
und das nächste mal wenn ich ne Frage zu deiner Lib habe wende ich mich gleich an dich :cheers:

Big THX und mfg.Dominik

:dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 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