#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 когда-либо обновит ваш указатель индекса, он будет пересчитан.