Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Mehrere gleichnamige Elemente

  Alt 7. Feb 2008, 22:00
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 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 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.
  Mit Zitat antworten Zitat