1

内部に Awesomium ウェブブラウザを含む C# Windows フォーム アプリケーションを作成しています。

テーブルからいくつかの行を取得し、それらを解析して配列にしようとしています。JSPart はブラウザ内で正常に実行されています。

C#内で使用するコードは次のとおりです。

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

Chrome 内で2 行が返さtrれるようになりましたが、それはもっと後であるため、foreach を使用して要素をループできることを望んでいましたが、ループする方法が見つかりません。

誰かが何か考えがありますか?

4

1 に答える 1

4

Javascript で無名関数を使用してテーブルを解析し、内容を文字列の配列の配列として返します。これは、C# での解析が容易になります。

Javascript でテーブルを解析する例については、http://jsfiddle.net/stevejansen/xDZQP/を参照してください。(補足: データ ソースがこのデータにアクセスするための 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);
    }
}
于 2014-02-15T20:32:35.503 に答える