2014-02-14 10 views
1

나는 내부에 Awesomium webbrowser가있는 C# Windows Form Application을 만들고 있습니다.Loop through Awesomium JSObject

테이블에서 일부 행을 가져 와서 배열로 구문 분석하려고합니다. JSPart는 브라우저 내부에서 잘 돌아갑니다. 여기

내가 C#을 내부에서 사용하는 코드입니다 :

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

크롬 내부 지금이 개 tr 행을 반환하지만 더 이상이어야한다, 그래서 나는 기대했다 내가 foreach 문을 가진 요소를 통해 루프를 수 ,하지만 그것을 통해 반복하는 방법을 찾을 수 없습니다.

아무도 아이디어가 있습니까?

+1

나는 오래 전에 프로젝트에서 Awesomium을 사용했고 페이지에서 내용을 얻으려고 애썼다. 결국 나는 여기에서 찾을 수있는 HTML 민첩성 팩을 전환하고 사용했습니다 : http://htmlagilitypack.codeplex.com/ 페이지에서 컨텐트를 긁어 내기가 훨씬 쉬워졌습니다. – bhs

+0

@bhs, 전에 htmlafility로 약간의 프로젝트에 참여했습니다. 더 이상 어떻게되었는지 정확히 모릅니다. 그러나 나는 그것이 매우 괴롭기 때문에 awesomium을 좋아한다. 그래서 나는 "간단한"대답, 또는 다른 htmlafilitypack에 다시있을거야 ... – Mathlight

+0

나는 그들을 함께 사용 - 응용 프로그램은 Awesomium 승리 브라우저 구성 요소를 표시하는 데 사용되는 지불 게이트웨이 주변 Windows 래퍼를 표시하는 그 페이지. – bhs

답변

4

Javascript에서 익명 함수를 사용하여 테이블을 구문 분석하고 내용을 문자열 배열로 반환합니다. 이것은 C#에서 구문 분석하기가 더 쉬울 것입니다.

자바 스크립트로 표를 파싱하는 예는 http://jsfiddle.net/stevejansen/xDZQP/을 참조하십시오. (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 나를. 나는 지금 내 전화를 사용하고있다. 그러나 나는 이것에 대해 tomorow를 점검 할 것이다. 설명해 주셔서 감사합니다. – Mathlight

+0

고맙습니다. 그것은 효과가 있었다. 단 한가지 만있었습니다. 이 코드 줄 (그리고 다른 두 가지는 비슷합니다)은 나에게 오류를주었습니다 :'if (row == null ||':'모호한 사용자 정의 변환 'Awesomium.Core.JSValue.implicit 연산자 Awesomium.Core.JSValue (string) '및'Awesomium.Core.JSValue.implicit 연산자 Awesomium.Core.JSValue (Awesomium.Core.JSObject) '에서' '을'Awesomium.Core.JSValue '로 변환하면'== null을 삭제 한 후 ' – Mathlight

+0

또한,'foreach cell' 내부에서 if 문으로 다시 한번 확인해 봅니다.''row' 대신에'cell'을 체크 할려고했던 것 같습니까? – Mathlight