2

我正在尝试从 twitter atom/xml 提要中获取正确的数据。我在 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',''));

我得到的是第一个链接标签的 href 值,但我想要第二个链接标签,我不知道该怎么做。有人有什么想法吗?

谢谢。

4

3 回答 3

5

你可以这样做:

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

因为ChildNodes是一个IXMLNodeList对象。确保检查节点“2”是否存在以及它是否具有type="image/png"属性 - 始终验证您的数据。

这是 Delphi 文档的一部分,

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

描述

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

IndexOrName标识所需的节点。有可能

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

如果 IndexOrName 未标识列表中的节点,并且包含此节点列表的父节点的文档在其 Options 属性中包含 doNodeAutoCreate,则节点列表尝试使用 IndexOrName 指定的名称创建新节点。如果节点列表无法创建新节点,则会引发异常。

于 2009-07-05T15:34:23.880 回答
4

Nick 的解决方案有效,但假定图像元素始终是第三个子节点。如果由于某种原因不是,那么您将再次遇到问题。更好的解决方案是遍历子节点并检查具有属性 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;
于 2009-07-06T09:52:33.397 回答
0

*添加节点名称

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;
于 2017-06-14T12:13:06.777 回答