Нужна помощь в разборе XML-документа Twitter на переменные в VB.NET ?

#xml #vb.net #parsing #twitter

#xml #vb.net #Синтаксический анализ #Twitter

Вопрос:

Итак, я потратил день или около того, пытаясь заставить это работать. Мне нужно проанализировать XML-документ из Twitter, выбрав определенные узлы и поместив значение в переменные. Я получаю сообщение об ошибке…Преобразование строки «user / screen_name» в тип «Integer» недопустимо. Синтаксический анализ XML не в моей компетенции. буду признателен за любую помощь… вот что у меня есть на данный момент.

Сначала XML-файл Twitter…

 <?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
<created_at>Sat Apr 30 04:10:46  0000 2011</created_at>
<id>64179865481510912</id>
<text>@sixrevisions implementing the Twitter API for my new portfolio site!</text>
<source><a href="http://twitter.com/#!/download/iphone" rel="nofollow">Twitter for iPhone</a></source>
<truncated>false</truncated>
<favorited>false</favorited>
<in_reply_to_status_id>64087873804189696</in_reply_to_status_id>
<in_reply_to_user_id>14444403</in_reply_to_user_id>
<in_reply_to_screen_name>sixrevisions</in_reply_to_screen_name>
<retweet_count>0</retweet_count>
<retweeted>false</retweeted>
<user>
  <id>92868468</id>
  <name>Timothy Antonucci</name>
  <screen_name>TimAtWerked</screen_name>
  <location>Boston, MA</location>
  <description>My name is Tim a web designer/developer in Boston, I love cars and photography ;-)</description>
  <profile_image_url>http://a2.twimg.com/profile_images/1336500668/wrkdtwitico_normal.gif</profile_image_url>
  <url>http://www.werked.com</url>
  <protected>false</protected>
  <followers_count>14</followers_count>
  <profile_background_color>b2c789</profile_background_color>
  <profile_text_color>333333</profile_text_color>
  <profile_link_color>0084B4</profile_link_color>
  <profile_sidebar_fill_color>b3d6af</profile_sidebar_fill_color>
  <profile_sidebar_border_color>6e996a</profile_sidebar_border_color>
  <friends_count>34</friends_count>
  <created_at>Fri Nov 27 00:35:31  0000 2009</created_at>
  <favourites_count>0</favourites_count>
  <utc_offset>-18000</utc_offset>
  <time_zone>Eastern Time (US amp; Canada)</time_zone>
        <profile_background_image_url>http://a3.twimg.com/profile_background_images/97017170/1440x900sm.jpg</profile_background_image_url>
  <profile_background_tile>true</profile_background_tile>
  <profile_use_background_image>true</profile_use_background_image>
  <notifications />
  <geo_enabled>false</geo_enabled>
  <verified>false</verified>
  <following />
  <statuses_count>39</statuses_count>
  <lang>en</lang>
  <contributors_enabled>false</contributors_enabled>
  <follow_request_sent />
  <listed_count>0</listed_count>
  <show_all_inline_media>false</show_all_inline_media>
  <default_profile>false</default_profile>
  <default_profile_image>false</default_profile_image>
  <is_translator>false</is_translator>
</user>
<geo />
<coordinates />
<place />
<contributors />
</status>
</statuses>
  

Далее мой код…

  Dim m_xmld As XmlDocument
 Dim m_nodelist As XmlNodeList
 Dim m_node As XmlNode
 m_xmld = New XmlDocument()
 m_xmld.Load("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=timatwerkedamp;count=4amp;include_rts=true")
 m_nodelist = m_xmld.SelectNodes("/statuses/status")
 For Each m_node In m_nodelist
    Dim twitName = m_node.ChildNodes.Item("screen_name").InnerText
    Dim twitrName = m_node.ChildNodes.Item("name").InnerText
    Dim twitText = m_node.ChildNodes.Item("text").InnerText
    Dim twitPic = m_node.ChildNodes.Item("profile_image_url").InnerText
    Dim twitTime = m_node.ChildNodes.Item("created_at").InnerText
    twitPic = twitPic.Replace("normal", "mini")
    twitProLink = "http://www.twitter.com/" amp; twitName
    'Do Stuff with variables
 Next
  

Хорошо, мне следовало уделить больше внимания ошибке и Visual Studio. Item извлекает узел с заданным индексом в виде целого числа. Я искал имя строки, поэтому я просто сосчитал элементы с 0 и использовал номер, который искал элемент… смотрите код ниже.

  Dim m_xmld As XmlDocument
 Dim m_nodelist As XmlNodeList
 Dim m_node As XmlNode
 m_xmld = New XmlDocument()
 m_xmld.Load("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=timatwerkedamp;count=4amp;include_rts=true")
 m_nodelist = m_xmld.SelectNodes("/statuses/status")
 For Each m_node In m_nodelist
   Dim twitName = m_node.ChildNodes.Item(11).ChildNodes.Item(2).InnerText
   Dim twitrName = m_node.ChildNodes.Item(11).ChildNodes.Item(1).InnerText
   Dim twitText = m_node.ChildNodes.Item(2).InnerText
   Dim twitPic = m_node.ChildNodes.Item(11).ChildNodes.Item(5).InnerText
   Dim twitTime = m_node.ChildNodes.Item(0).InnerText
   twitPic = twitPic.Replace("normal", "mini")
   twitProLink = "http://www.twitter.com/" amp; twitName
   'Do stuff with variables
  Next
  

Теперь единственная проблема, которую будет легко исправить, заключается в том, что ретвит отображается некорректно, потому что узлы разные, поэтому я просто добавлю If then, чтобы увидеть, является ли это ретвитом, а затем соответствующим образом скорректирую узлы. Еще раз спасибо.

Комментарии:

1. Хорошо, без проблем, я ответил на свой собственный вопрос, поскольку теперь это работает, просто опубликовал решение, которое я нашел в качестве ответа, чтобы другие могли видеть, как я это исправил, это не подробности или другой вопрос, это был ответ, который устранил мою проблему

2. Теперь, если вы хотите опубликовать ответ на свой вопрос, это другое. Не стесняйтесь добавлять это. Но если вам нужно дополнить свой вопрос более подробной информацией, пожалуйста, отредактируйте в будущем. Спасибо.

Ответ №1:

Решение, которое вы проиллюстрировали, не является хорошим решением, потому что ваш код сломается, если порядок узлов когда-либо изменится. Техника, которую вы проиллюстрировали, называется «магические числа». Лучший способ использовать XPath для разбора xml-объекта. Таким образом, порядок узлов не имеет значения.

Ответ №2:

Я думаю, вам понадобится

 Dim twitName = m_node.ChildNodes.Item("user").ChildNodes.Item("screen_name").InnerText
  

и аналогичные материалы для извлечения других элементов.

Комментарии:

1. Большое тебе спасибо, Бала, этот метод все еще не сработал… но это приблизило меня на шаг… очень нужна информация. Еще раз спасибо. Я опубликую ответ с кодом, который я использовал.

Ответ №3:

Попробуйте:

For Each m_node In m_nodelist
Dim twitName = m_node.ChildNodes.Item("user").ChildNodes.Item("screen_name").Value
'OtherNodes
'Do stuff with variables
Next

innerText предполагает, что элемент, который вы устанавливаете или получаете, имеет дочерние элементы. Значение получает только значение элемента без предполагаемых дочерних элементов, и, как заявил БалаР, ссылается на элемент по имени, поэтому, если twitter API когда-либо обновит ваш указатель индекса, он будет пересчитан.