2009-07-05 10 views
2

Ich versuche, die richtigen Daten von einem Twitter-Atom/XML-Feed zu bekommen. Ich habe die twitter Daten in einem txmldocument und versuche, einige spezifische Informationen von ihm zu erhalten.Delphi - XML ​​- childnodes - Attribute erhalten

Hier ist ein verkürztes Beispiel der Daten:

<entry> 
    <link type="text/html" rel="alternate" href="http://twitter.com/blub/statuses/1501068" /> 
    <title>title of twitter post goes here</title> 
    <link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/234870532/normal.jpg" /> 
</entry> 

Das Problem, das ich habe ist, dass ich versuche, das Profil Bild-URL (das href Attribut des zweiten Link-Tag) zu erhalten.

Wenn ich Code wie folgt:

i:=xmldocument1.DocumentElement.ChildNodes['entry']; 
text:=(i.ChildNodes['link'].GetAttributeNS('href','')); 

Was ich erhalte, ist die href-Wert des ersten Link-Tag, aber ich möchte den zweiten Link-Tag, und ich weiß nicht genau, wie das zu tun, . Hat jemand irgendwelche Ideen?

danke.

Antwort

5

Sie können dies tun:

i := xmldocument1.DocumentElement.ChildNodes['entry']; 
text := (i.ChildNodes[2].GetAttributeNS('href','')); // notice the [2] index 

weil ChildNodes ein IXMLNodeList Objekt ist. Stellen Sie sicher, dass Sie überprüfen, ob der Knoten "2" vorhanden ist und ob die Eigenschaft type="image/png" vorliegt - validieren Sie Ihre Daten immer.

Hier ist ein Teil der Dokumentation Delphi,

property Nodes[const IndexOrName: OleVariant]: IXMLNode; default; 

Beschreibung

lesen Knoten einen bestimmten Knoten in der Liste zuzugreifen.

IndexOrName identifiziert den gewünschten Knoten. Es kann

  • Der Index des Knotens sein, wobei 0 der Index des ersten Knotens ist, 1 der Index des zweiten Knotens ist, und so weiter. Die Count-Eigenschaft bietet einen oberen , der an die Indizes gebunden ist, die Sie angeben können.
  • Die LocalName-Eigenschaft eines Knotens in der Liste.

Wenn IndexOrName keinen Knoten in der Liste identifizieren, und wenn das Dokument , dass diese Knoten-Liste des Parent enthält enthält doNodeAutoCreate in seiner Eigenschaft Options, dann wird die Knotenliste mit einem neuen Knoten zu erstellen versucht der Name , der von IndexOrName angegeben wird. Wenn die Knotenliste den neuen Knoten nicht erstellen kann, löst sie eine Ausnahme aus ( ).

+0

, die gut funktioniert. Danke. –

+0

Ich bin froh, dass ich helfen konnte :) –

+0

Dan, ich denke, du solltest Nicks Antwort akzeptieren, wenn du damit zufrieden bist. Wenn nicht, bleibt diese Antwort für immer unbeantwortet. Außerdem gab ich Nick +1 für die Antwort. –

4

Nicks Lösung funktioniert aber nimmt an, dass das Bildelement immer der dritte Kindknoten ist. Wenn es aus irgendeinem Grund nicht ist, werden Sie wieder Probleme bekommen. Eine bessere Lösung besteht darin, die untergeordneten Knoten durchzulaufen und nach dem mit dem Attribut type = "image/png" zu suchen.

EntryNode := xmldocument1.DocumentElement.ChildNodes['entry']; 
for i := 0 to EntryNode.ChildNodes.Count do 
    if EntryNode.ChildNodes[i].HasAttribute('type') 
    and EntryNode.ChildNodes[i].Attribute['type'] = 'image/png' then 
    begin 
     text := EntryNode.ChildNodes[i].Attribute['href']; 
     Break; 
    end; 
0

* hinzugefügt Nodename

EntryNode := xmldocument1.DocumentElement.ChildNodes['entry']; 
for i := 0 to EntryNode.ChildNodes.Count do 
    if EntryNode.ChildNodes[i].NodeName='link' 
    and EntryNode.ChildNodes[i].HasAttribute('type') 
    and EntryNode.ChildNodes[i].Attribute['type'] = 'image/png' then 
    begin 
     text := EntryNode.ChildNodes[i].Attribute['href']; 
     Break; 
    end;