2014-02-14 6 views
1

Я делаю приложение C# для Windows Form с веб-браузером Awesomium внутри него.Loop through Awesomium JSObject

Я пытаюсь получить некоторые строки из таблицы и разделить их на массив. JSPart работает в браузере отлично.

Вот код, который я использую в C#:

JSObject villageRows = view.ExecuteJavascriptWithResult("document.getElementById(\"production_table\").getElementsByTagName(\"tbody\")[0].getElementsByTagName(\"tr\");"); 
if (villageRows == null) 
{ 
    return; 
} 

Это возвращает теперь 2 tr строки внутри Chrome, но это будет чуть позже, так что я надеялся, что я мог бы петлю через элементы с Еогеасп , но я не могу найти какой-либо способ его прокрутки.

Есть ли у кого-нибудь идеи?

+1

Я использовал Awesomium в проекте не так давно и изо всех сил пытался получить контент со страниц. В конце я переключил и использовал пакет Agility Pack, который можно найти здесь: http://htmlagilitypack.codeplex.com/ Мне было намного легче «очистить» содержимое со страниц. – bhs

+0

@bhs, я раньше работал над небольшим проектом с htmlafility. Не знаю точно, как это продолжалось. Но мне нравится awesomium, потому что он быстро замирает. Поэтому я надеюсь, что есть «простой» ответ, иначе я вернусь к htmlafilitypack ... – Mathlight

+0

Я использовал их оба вместе - приложение было оберткой Windows вокруг платежного шлюза, в котором использовался компонент браузера Awesomium win display страница. – bhs

ответ

4

Я бы использовал анонимную функцию в Javascript для разбора таблицы и возврата содержимого в виде массива из массива строк. Это будет проще проанализировать на C#.

См. http://jsfiddle.net/stevejansen/xDZQP/ для примера анализа таблицы в Javascript. (Sidenote: я бы посмотрел, может ли ваш источник данных предоставлять REST API или аналогичный доступ к этим данным, разбор HTML очень хрупкий.)

Это примерно то, как я хотел бы объединить C# и JS для решения вашей проблемы C# не проверен). Обратите внимание, что вы использовали неправильный тип возврата для IWebView.ExecuteJavascriptWithResult.

const string JAVASCRIPT = @"(function() { 
    var table = document.getElementById('production_table'), 
     records = []; 

    if (table == null) return; 

    table = table.getElementsByTagName('tbody'); 

    if (table == null || table.length === 0) return; 

    // there should only be one tbody element in a table 
    table = table[0]; 

    // getElementsByTagName returns a NodeList instead of an Array 
    // but we can still use Array#forEach on it 
    Array.prototype.forEach.call(table.getElementsByTagName('tr'), 

    function (row) { 
    var record = []; 
     Array.prototype.forEach.call(row.getElementsByTagName('td'), 
     function (cell) { 
     record.push(cell.innerText); 
     }); 
     records.push(record); 
    }); 

    return records; 
})();"; 

JSValue result = view.ExecuteJavascriptWithResult(JAVASCRIPT); 
JSValue[] records; 
JSValue[] record; 

if (result.IsNull || !result.IsArray) 
    return; 

records = (JSValue[])result; 

foreach(JSValue row in records) 
{ 
    if (row == null || row.IsNull || !row.IsArray) 
     continue; 

    record = (JSValue[])row; 

    foreach(JSValue cell in record) 
    { 
     if (cell.IsNull || !cell.IsString) 
     continue; 
     System.Diagnostics.Debug.WriteLine((string)cell); 
    } 
} 
+0

EThis выглядит хорошо меня. Я сейчас на телефоне, но я проверю это завтра. Спасибо за объяснение. – Mathlight

+0

Спасибо. Это сработало. Было всего одно. эта строка кода (и другие 2, которые похожи) дала мне ошибку: 'if (row == null ||': 'Неоднозначные пользовательские преобразования 'Awesomium.Core.JSValue.implicit operator Awesomium.Core.JSValue (строка) 'и' Awesomium.Core.JSValue.implicit operator Awesomium.Core.JSValue (Awesomium.Core.JSObject) 'при преобразовании из' 'в' Awesomium.Core.JSValue''. Поэтому после того, как я удалил '== null ', это сработало. – Mathlight

+0

Кроме того, внутри вашей ячейки foreach вы выполняете другую проверку с помощью оператора if. Предположим, вы хотели проверить на' cell' вместо 'row'? – Mathlight