2009-07-05 11 views
2

J'essaie d'obtenir les données correctes d'un flux twitter atom/xml. J'ai les données de Twitter dans un document txmldocument et j'essaye d'obtenir des informations spécifiques de lui.Delphi - XML ​​- childnodes - obtention d'attributs

Voici un exemple tronqué des données:

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

Le problème que j'ai est que je suis en train d'obtenir l'URL de l'image de profil (l'attribut href de la deuxième balise de lien).

Si j'utilise le code comme ceci:

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

Ce que je reçois est la valeur href de la balise FIRST lien, mais je veux la balise de lien SECOND, et je ne sais pas comment faire exactement cela . Est-ce que quelqu'un a des idées?

merci.

Répondre

5

Vous pouvez le faire:

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

parce ChildNodes est un objet IXMLNodeList. Assurez-vous que vous vérifiez si le noeud '2' existe et s'il a la propriété type="image/png" - validez toujours vos données.

Voici une partie de la documentation Delphi,

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

Description de

nœuds Lire pour accéder à un noeud spécifié dans la liste.

IndexOrName identifie le nœud souhaité. Il peut être

  • L'indice du noeud, où 0 est l'index du premier noeud, 1 est l'indice du second noeud, et ainsi de suite. La propriété Count fournit un supérieur lié aux index que vous pouvez spécifier.
  • La propriété LocalName d'un nœud de la liste.

Si IndexOrName ne permet pas d'identifier un nœud dans la liste, et si le document qui contient ce parent de la liste des noeuds comprend doNodeAutoCreate dans sa propriété Options, puis la liste des nœuds tente de créer un nouveau noeud avec le nom spécifié par IndexOrName. Si la liste des noeuds ne peut pas créer le nouveau noeud, déclenche une exception.

+0

qui fonctionne très bien. Je vous remercie. –

+0

Je suis content de pouvoir aider :) –

+0

Dan, je pense que tu devrais accepter la réponse de Nick si tu es content. Si non, cette réponse restera simplement marquée comme sans réponse pour toujours. Aussi, j'ai donné +1 à Nick pour la réponse. –

4

La solution de Nick fonctionne mais suppose que l'élément image est toujours le troisième noeud enfant. Si pour une raison quelconque, ce n'est pas le cas, vous rencontrerez à nouveau des problèmes. Une meilleure solution est de faire une boucle dans les nœuds enfants et de vérifier celle avec l'attribut type = "image/png".

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

* ajouté 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; 
Questions connexes