2009-07-05 4 views
2

Я пытаюсь получить правильные данные из канала twitter atom/xml. У меня есть данные twitter в txmldocument и я пытаюсь получить от него определенную информацию.Delphi - XML ​​- childnodes - получение атрибутов

Вот краткий пример данных:

<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 изображения профиля (атрибут ссылки второго звена тега).

Если я использую такой код:

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

Что я получаю это HREF значения первого тега ссылки, но я хочу второе звено тега, и я не знаю точно, как это сделать , У кого-нибудь есть идеи?

спасибо.

ответ

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 не идентифицирует узла в списке, и если документ , который содержит родительский этот список узла включает doNodeAutoCreate в свойстве Options, то список узлов пытаются создать новый узел с имя , указанное IndexOrName. Если список узлов не может создать новый узел, то вызывает исключение.

+0

, что работает отлично. Спасибо. – 2009-07-05 20:22:55

+0

Я рад, что смогу помочь :) –

+0

Дэн, я думаю, вы должны принять ответ Ника, если вы довольны этим. Если нет, этот ответ будет оставаться неизменным навсегда. Кроме того, я дал Нику +1 за ответ. –

4

Решение Ник работает, но предполагает, что элемент изображения всегда является третьим дочерним узлом. Если по какой-то причине это не так, вы снова столкнетесь с проблемами. Лучшим решением является прохождение через дочерние узлы и проверка того, у кого есть атрибут 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

* добавлено 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; 
Смежные вопросы