Цикл через Awesomium JSObject
Я делаю C# Windows Form Application с веб-браузером Awesomium внутри него.
Я пытаюсь получить некоторые строки из таблицы и проанализировать их в массив. JSPart работает внутри браузера нормально.
Вот код, который я использую внутри C#:
JSObject villageRows = view.ExecuteJavascriptWithResult("document.getElementById(\"production_table\").getElementsByTagName(\"tbody\")[0].getElementsByTagName(\"tr\");");
if (villageRows == null)
{
return;
}
Теперь возвращается 2 tr
строк внутри Chrome, но это будет позже, так что я надеялся, что смогу пройтись по элементам с помощью foreach, но я не могу найти какой-либо способ пройти по нему.
У кого-нибудь есть идеи?
1 ответ
Я бы использовал анонимную функцию в Javascript для разбора таблицы и возврата содержимого в виде массива строк. Это будет легче разобрать в C#.
См. http://jsfiddle.net/stevejansen/xDZQP/ для примера анализа таблицы в Javascript. (Примечание. Я хотел бы проверить, предоставляет ли ваш источник данных API REST или аналогичный для доступа к этим данным; анализ 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);
}
}