Цикл через 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);
    }
}
Другие вопросы по тегам