2014-01-14 2 views
0

Я новичок в кодировании на C#, и я делаю небольшую программу, чтобы очистить текущее значение биткойна от Mt.Gox.Ошибка соскабливания значения C#

Вот код, я в настоящее время с помощью:

namespace BitcoinValueScraper 
{ 
    public partial class GetValue : Form 
{ 
     public GetValue() 
     { 
      InitializeComponent(); 
     } 

     private void GetValue_Load(object sender, EventArgs e) 
     { 
      System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser(); 
      wb.Navigate("www.mtgox.com"); 
      wb.Stop(); 
      wb.Document.GetElementById("lastPrice").SetAttribute("value", textBox1.Text); 
     } 

    } 

} 

Возвращается с:

«Необработанное исключение типа 'System.NullReferenceException' произошло в BitcoinValueScraper.exe Дополнительная информация: Объект ссылка не установлена ​​в экземпляр объекта. "

Помогите пожалуйста!

+4

Вы используете скомпилированную программу без отладки? Попробуйте отладить его, чтобы вы могли видеть, из какой строки генерируется NullReferenceException из ... –

+0

Возможно, что 'wb.Document' равно null. Может быть, что 'wb.Document.GetElementById (" lastPrice ")' равно null. Может быть, 'textBox1' имеет значение NULL. – Bobson

+0

просто комментарий, вместо соскабливания вы можете использовать их api (https://en.bitcoin.it/wiki/MtGox/API/HTTP/v1#public_information). т.е.: http://data.mtgox.com/api/1/BTCUSD/ticker –

ответ

0

Если что-нибудь попробовать:

namespace BitcoinValueScraper 
    { 
     public partial class GetValue : Form 
     { 
      System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser(); 
      public GetValue() 
      { 
       InitializeComponent(); 
      } 

      private void GetValue_Load(object sender, EventArgs e) 
    { 
     wb.Navigate("www.mtgox.com"); 
     wb.DocumentCompleted += wb_LoadCompleted; 
    } 
    void wb_LoadCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     HtmlDocument doc = wb.Document; 
     textBox1.Text = doc.GetElementById("lastPrice").ToString(); 
    }   
     } 
+0

while (wb.ReadyState! = WebBrowserReadyState.Complete) { Application.DoEvents(); } wb.Document.GetElementById ("lastPrice"). SetAttribute ("value", textBox1.Text); –

+0

Но я до сих пор получаю: «Отладчик: Исключение перехвачено: GetValue_Load, Form1.cs строка 28 Исключение было перехвачено, а стек вызовов разворачивался до точки перед вызовом из кода пользователя, в котором произошло исключение.« Отмотайте стек вызовов на необработанных исключениях "выбран в настройках отладчика." –

+1

user2453734 объясняет, почему это null, вам нужно дождаться загрузки страницы, прежде чем вы сможете запросить html. Просто замените его GetElementById на lastPrice. –

1

Вы должны связываться с LoadCompleted Событие на контроле WebBrowser. Если вы этого не сделаете, документ в элементе управления будет пустым. Страница еще не загружена.

Пример кода:

public WebBrowser webb; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     webb = new WebBrowser(); 
     webb.LoadCompleted += webb_LoadCompleted; 
     webb.Navigate("http://www.google.com"); 

    } 

    void webb_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
     //NOW DOCUMENT SHOULD NOT BE NULL 
     MessageBox.Show("Completed loading the page"); 

     mshtml.HTMLDocument doc = webb.Document as mshtml.HTMLDocument; 
     mshtml.HTMLInputElement obj = doc.getElementById("gs_taif0") as mshtml.HTMLInputElement; 
     mshtml.HTMLFormElement form = doc.forms.item(Type.Missing, 0) as mshtml.HTMLFormElement; 
    } 

Выше для окна презентации управления WebBrowser фундамент. В окне формы я считаю, что событие: DocumentCompleted ссылка: http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser%28v=vs.110%29.aspx

Здесь окна формы кода (я только проверил это):

private System.Windows.Forms.WebBrowser wb; 

    public Form1() 
    { 
     InitializeComponent(); 
     GetValue_Load(null, EventArgs.Empty); 
    } 

    private void GetValue_Load(object sender, EventArgs e) 
    { 
     wb = new System.Windows.Forms.WebBrowser(); 
     wb.DocumentCompleted += wb_DocumentCompleted; 
     wb.Navigate("http://www.google.com"); 
    } 

    void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     MessageBox.Show("Document loading completed"); 
     //GET YOUR DOCUMENT HERE 
    } 
0

Пока не прямой ответ на проблему коды вы в настоящее время сталкиваетесь с Я бы очень хотел предложить вам попробовать сделать что-то по-другому, потому что попытка вытащить информацию из HTML на веб-сайт, как будто это очень хрупкая (если они меняют разметку на всех ваших кодах) и просто не так много уровней. В общем, программисты обычно полагаются на API данных для запроса такого рода информации, поскольку он предоставляет стандартизованный и (надеюсь) протестированный способ запроса информации. Быстрый поиск в Google показал некоторые Биткойн API, предлагаемые BlockChain, которые, похоже, очень хорошо смотрятся в мире биткойнов. Вот пример API вызова для запроса Bitcoin бирж ставок:

http://blockchain.info/api/exchange_rates_api

Делая запрос HTTP к их API вы можете гораздо более надежно выпадающим информацию, которую вы ищете, и отобразить его в вашем пользовательский интерфейс.

Дальнейших Bitcoin API ресурсов можно найти здесь:

http://blockchain.info/api

К сожалению, как вы новичок в программирование, так и взаимодействие с API, его трудно дать вам ответ, не тратя время физически написать код для вас. Однако я могу сказать, что в настоящее время ваш подход неправильный. Объект WebBrowser не является подходящим механизмом для взаимодействия с веб-API. Более подходящим подходом было бы сделать HTTP-вызов URL-адреса API, который вы опубликовали, а затем прочитать JSON из ответа. Затем это необходимо проанализировать в каком-то формате, что имеет смысл для вашего приложения (например, простой объект Price и т. Д.). В Интернете много статей о разборе JSON с C#, а также о взаимодействии с веб-интерфейсами через HTTP-протокол. Я определенно рекомендую вам начать там.

Вот отличная стартовая статья, которая поможет вам создать базовое приложение для взаимодействия с API-интерфейсами JSON. Просто замените URL-адреса Bing на соответствующие BitCoin, и у вас должна быть хорошая отправная точка.

Смежные вопросы