Delphi - XML - 子节点 - 获取属性

时间:2009-07-05 14:26:20

标签: xml delphi txmldocument

我正在尝试从twitter atom / xml Feed中获取正确的数据。我在txmldocument中有twitter数据,并试图从中获取一些特定信息。

以下是数据的截断示例:

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

我遇到的问题是我试图获取个人资料图片网址(第二个链接标记的href属性)。

如果我使用这样的代码:

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

我得到的是FIRST链接标记的href值,但我想要SECOND链接标记,而我不确切知道如何做到这一点。有没有人有任何想法?

感谢。

3 个答案:

答案 0 :(得分:5)

你可以这样做:

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

因为ChildNodesIXMLNodeList个对象。确保检查节点“2”是否存在以及是否具有type="image/png"属性 - 始终验证您的数据
这是Delphi文档的一部分,

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

描述

     

读取节点以访问指定节点   在列表中。

     

IndexOrName 标识所需内容   节点。它可以是

     
      
  • 节点的索引,其中0是第一个节点的索引,1是   第二个节点的索引,依此类推。   Count属性提供鞋面   绑定在您可以指定的索引上。
  •   
  • 列表中节点的LocalName属性。
  •   
     

如果IndexOrName无法识别   列表中的节点,如果是文档   包含此节点列表的父级   其中包括doNodeAutoCreate   选项属性,然后是节点列表   尝试用。创建一个新节点   IndexOrName指定的名称。如果   节点列表无法创建新节点,   它提出了一个例外。

答案 1 :(得分:4)

Nick的解决方案有效,但假设image元素始终是第三个子节点。如果由于某种原因不是那么你会再次遇到问题。更好的解决方案是遍历子节点并检查属性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;

答案 2 :(得分:0)

*添加了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;