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;