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.