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

发布于 2024-07-26 18:33:45 字数 748 浏览 5 评论 0原文

我正在尝试从 Twitteratom/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>

我遇到的问题是我正在尝试获取个人资料图像 url(第二个链接标记的 href 属性)。

如果我使用这样的代码:

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

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

谢谢。

I am trying to get the correct data from a twitter atom/xml feed. I have the twitter data in a txmldocument and am trying to get some specific information from it.

Here is a truncated example of the data:

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

The problem I have is that I am trying to get the profile image url (the href attribute of the second link tag).

If I use code like this:

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

What I get is the href value of the FIRST link tag, but I want the SECOND link tag, and I don't know exactly how to do that. Does anybody have any ideas?

thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南笙 2024-08-02 18:33:45

您可以这样做:

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;

描述

Read Nodes 访问指定节点
在列表中。

IndexOrName 标识所需的
节点。 可以是

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

如果 IndexOrName 未标识
列表中的节点,并且如果文档
包含此节点列表的父节点
在其中包含 doNodeAutoCreate
选项属性,然后是节点列表
尝试创建一个新节点
由 IndexOrName 指定的名称。 如果
节点列表无法创建新节点,
它引发了一个异常。

You could do this:

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

because ChildNodes is an IXMLNodeList object. Make sure that you check if node '2' exists and if it has the type="image/png" property - always validate your data.

Here is a part of the Delphi documentation,

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

Description

Read Nodes to access a specified node
in the list.

IndexOrName identifies the desired
node. It can be

  • The index of the node, where 0 is the index of the first node, 1 is the
    index of the second node, and so on.
    The Count property provides an upper
    bound on the indexes you can specify.
  • The LocalName property of a node in the list.

If IndexOrName does not identify a
node in the list, and if the document
that contains this node list’s parent
includes doNodeAutoCreate in its
Options property, then the node list
tries to create a new node with the
name specified by IndexOrName. If the
node list can’t create the new node,
it raises an exception.

温暖的光 2024-08-02 18:33:45

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

Nick's solution works but assumes the image element is always the third child node. If for some reason it isn't then you will run into problems again. A better solution is to loop through the child nodes and check for the one with the attribute 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;
一片旧的回忆 2024-08-02 18:33:45

*添加节点名称

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;

*added 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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文