Delphi - XML ​​- дочерние узлы - получение атрибутов

Я пытаюсь получить правильные данные из твиттера atom/xml. У меня есть данные из твиттера в txmldocument, и я пытаюсь получить от них некоторую конкретную информацию.

Вот усеченный пример данных:

<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 тега ссылки FIRST, но мне нужен тег ссылки SECOND, и я точно не знаю, как это сделать. У кого-нибудь есть идеи?

Благодарю.

3 ответа

Вы могли бы сделать это:

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

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

* добавлено имя узла

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;
Другие вопросы по тегам