C# 循环遍历Awesomium JSObject

C# 循环遍历Awesomium JSObject,c#,winforms,awesomium,jsobject,C#,Winforms,Awesomium,Jsobject,我正在制作一个C#Windows窗体应用程序,其中包含一个Awesomium webbrowser 我试图从表中获取一些行,并将它们解析为数组。JSPart在浏览器中运行良好 下面是我在C#中使用的代码: 现在它在Chrome中返回2行,但以后会更多,所以我希望可以用foreach循环遍历元素,但我找不到任何方法来循环遍历它 有人知道吗?我会使用Javascript中的匿名函数来解析表,并将内容作为字符串数组返回。这将更容易在C#中解析 有关在Javascript中解析表的示例,请参见。(旁注:

我正在制作一个C#Windows窗体应用程序,其中包含一个Awesomium webbrowser

我试图从表中获取一些行,并将它们解析为数组。JSPart在浏览器中运行良好

下面是我在C#中使用的代码:

现在它在Chrome中返回2行,但以后会更多,所以我希望可以用foreach循环遍历元素,但我找不到任何方法来循环遍历它


有人知道吗?

我会使用Javascript中的匿名函数来解析表,并将内容作为字符串数组返回。这将更容易在C#中解析

有关在Javascript中解析表的示例,请参见。(旁注:我会检查您的数据源是否提供了RESTAPI或类似工具来访问这些数据;解析HTML非常脆弱。)

这大概就是我如何结合C和JS来解决您的问题(C未经测试)。注意:您对
IWebView.ExecuteJavascriptWithResult使用了错误的返回类型

conststringjavascript=@”(函数(){
var table=document.getElementById('production_table'),
记录=[];
if(table==null)返回;
table=table.getElementsByTagName('tbody');
if(table==null | | table.length==0)返回;
//表中应该只有一个tbody元素
表=表[0];
//getElementsByTagName返回节点列表而不是数组
//但我们仍然可以在上面使用Array#forEach
Array.prototype.forEach.call(table.getElementsByTagName('tr'),
功能(世界其他地区){
var记录=[];
Array.prototype.forEach.call(row.getElementsByTagName('td'),
功能(单元){
record.push(cell.innerText);
});
记录。推送(记录);
});
退货记录;
})();";
JSValue result=view.ExecuteJavascriptWithResult(JAVASCRIPT);
JSValue[]记录;
JSValue[]记录;
if(result.IsNull | |!result.IsArray)
回来
记录=(JSValue[])结果;
foreach(记录中的JSValue行)
{
if(row==null | | | row.IsNull | |!row.IsArray)
持续
记录=(JSValue[])行;
foreach(记录中的JSValue单元格)
{
if(cell.IsNull | |!cell.IsString)
持续
System.Diagnostics.Debug.WriteLine((字符串)单元格);
}
}

我将使用Javascript中的匿名函数解析表,并将内容作为字符串数组返回。这将更容易在C#中解析

有关在Javascript中解析表的示例,请参见。(旁注:我会检查您的数据源是否提供了RESTAPI或类似工具来访问这些数据;解析HTML非常脆弱。)

这大概就是我如何结合C和JS来解决您的问题(C未经测试)。注意:您对
IWebView.ExecuteJavascriptWithResult使用了错误的返回类型

conststringjavascript=@”(函数(){
var table=document.getElementById('production_table'),
记录=[];
if(table==null)返回;
table=table.getElementsByTagName('tbody');
if(table==null | | table.length==0)返回;
//表中应该只有一个tbody元素
表=表[0];
//getElementsByTagName返回节点列表而不是数组
//但我们仍然可以在上面使用Array#forEach
Array.prototype.forEach.call(table.getElementsByTagName('tr'),
功能(世界其他地区){
var记录=[];
Array.prototype.forEach.call(row.getElementsByTagName('td'),
功能(单元){
record.push(cell.innerText);
});
记录。推送(记录);
});
退货记录;
})();";
JSValue result=view.ExecuteJavascriptWithResult(JAVASCRIPT);
JSValue[]记录;
JSValue[]记录;
if(result.IsNull | |!result.IsArray)
回来
记录=(JSValue[])结果;
foreach(记录中的JSValue行)
{
if(row==null | | | row.IsNull | |!row.IsArray)
持续
记录=(JSValue[])行;
foreach(记录中的JSValue单元格)
{
if(cell.IsNull | |!cell.IsString)
持续
System.Diagnostics.Debug.WriteLine((字符串)单元格);
}
}

不久前,我在一个项目中使用了Awesomium,并努力从页面中获取内容。最后,我切换并使用了可以在这里找到的HTML Agility包:我发现从页面“刮取”内容要容易得多。@bhs,我以前在htmlafility上做过一个小项目。我不知道到底是怎么回事了。但我喜欢冬虫夏草,因为它的速度太快了。所以我希望有一个“简单”的答案,否则我会回到HTMLFilityPack…我同时使用了它们-该应用程序是一个围绕支付网关的Windows包装,使用Awesomium win浏览器组件显示页面。@bhs,问题是整个项目依赖于一个web会话,所以我认为我不能同时使用它们。。。如果这是可能的,我会非常高兴:不久前,我在一个项目中使用了Awesomium,并努力从页面中获取内容。最后,我切换并使用了可以在这里找到的HTML Agility包:我发现从页面“刮取”内容要容易得多。@bhs,我以前在htmlafility上做过一个小项目。我不知道到底是怎么回事了。但我喜欢冬虫夏草,因为它的速度太快了。所以我希望有一个“简单”的答案,否则我会回到HTMLFilityPack…我同时使用了它们-该应用程序是一个围绕支付网关的Windows包装,使用Awesomium win浏览器组件显示页面。@bhs,问题是整个项目依赖于一个web会话,所以我认为我不能同时使用它们。。。如果可能的话,我会很高兴的:这条路对我来说很好。我现在在打电话,但我明天会查一下。谢谢你的解释谢谢。成功了。只有一件事。这行代码(和其他两行代码类似)给了我一个错误:
if(row==null | |
用户定义的不明确转换的Awesomium.Core.JSValue.implicit o
JSObject villageRows = view.ExecuteJavascriptWithResult("document.getElementById(\"production_table\").getElementsByTagName(\"tbody\")[0].getElementsByTagName(\"tr\");");
if (villageRows == null)
{
    return;
}