hariva
چهارشنبه 14 شهریور 1386, 00:51 صبح
هدف این تاپیک ساخت کلاسی است که بتواند اطلاعات یک جدول html را به یک datatable تبدیل کند.انجام چنین کاری با اکسس بسیار راحت است اما اگر بخواهیم محتوای صفحات وب را پردازش کنیم وجود چنین کلاسی واقعا ضروری است.من با جستجوی این سایت نتیجه ای نگرفتم و در سایت های خارجی هم چیز بدر بخوری نیافتم.نتیجه اینکه تصمیم گرفتم که آنرا بصورت پروژه در اینجا به کمک سایر دوستان اجرا کنم چون در نهایت حاصل آن برای همه میتواند کاربردی باشد.
کارها را من تقسیم بندی کرده ام تا هرکس هر بخشی را دوست دارد انجام دهد.
فرم اولیه کلاس را در زیر میبینید
روش کار اینچنین است
ابتدا پروپرتی html که از نوع string است به کلاس داده میشود.html شامل کد های html صفحه ی وب است.
پس از این کار تابع proccess بکار می افتد.
تابع proccess متن html را جستجو کرده و تمام جدول های موجود در آن را پیدا میکند. و اطلاعات مربوط به جداول را داخل متغیر آرایه ای tablelist قرار میدهد.این مشخصه ها شامل نام جدول مکان شروع جدول در html وطول آن و همچنین تعداد سطر و ستون و تعداد رکورد های آن میشود.
تابع پروسس همچنین یک مقدار عددی به متغیر tableCount میدهد که نشان دهنده ی تعداد جدول یافته شده در متن html است.
قسمت بعدی کلاس یک تابع است که با فرض اینکه tableCount نشان دهنده ی وجود حداقل یک جدول در متن کار میکند. این تابع Table2DataTableنام دارد و وضیفه اش تبدیل جدول به دیتاتیبل است .این تابع در دو حالت کار میکند .
در حالت اول با دادن ایندکس جدول مورد نظر سایر اطلاعات را از tablelist میگیرد.
در حالت دوم بطور مجزا با دادن نام متن و نقطه شروع و طول جدول خروجی اش دیتا تیبل است.
دلیل این دو گونه کارکرد این است که بتوان بطور مستقیم از این تابع در برنامه ها استفاده کرد.مثلا وقتی بطور متناوب ما اطلاعاتی را از یک صفحه ی وب در میآوریم لازم نیست همیشه آنرا پردازش کنیم.
شاد باشید
Public Class htmltable2DataTable
Public Property html() As String
Get
End Get
Set(ByVal Value As String)
proccess(Value)
End Set
End Property
Public TableCount As Integer
Public TableList(,) As String
'tablelist(,0)= table start index in html
'tablelist(,1)= table lenght in html
'tablelist(,2)= field count
'tablelist(,3)= record count
Dim position As Integer
Dim TableStart As Integer
Dim TableEnd As Integer
Dim FirstTable As Boolean
Dim i As Integer
Dim j As Integer
Public Function proccess(ByVal html As String)
position = 1
FirstTable = True
TableCount = 0
'find start of table
TableStart = InStr(position, html, "<table")
If TableStart > 0 Then
'find end of table
TableEnd = InStr(TableStart, html, "</table>")
position = TableEnd
If TableEnd > TableStart Then
'ERR
Else
If FirstTable = True Then
FirstTable = False
ReDim tablelist(1, 3)
Else
ReDim Preserve tablelist(UBound(tablelist) + 1, 3)
End If
'table start index in html
tablelist(UBound(tablelist), 0) = TableStart
'table lenght in html
tablelist(UBound(tablelist), 1) = TableEnd - TableStart + 7
'field count in one row
tablelist(UBound(tablelist), 2) = HowManyInStr(Mid(html, TableStart, InStr(TableStart, html, "</tr>") - TableStart + 4), "</td>") / 2
'record count
tablelist(UBound(tablelist), 3) = HowManyInStr(Mid(html, TableStart, TableEnd - TableStart + 7), "</tr>") / 2
TableCount = TableCount + 1
End If
End If
End Function
Private Function HowManyInStr(ByVal str As String, ByVal find As String) As Integer
End Function
Public Function Table2DataTable(ByVal TableIdx As Integer) As DataTable
Dim dr As DataRow
position = TableList(TableIdx, 0) 'table start index in html
For i = 0 To TableList(TableIdx, 3) 'record count
position = InStr(position, html, "</tr>")
Next
End Function
Public Function Table2DataTable(ByVal html As String, ByVal start As Integer, ByVal lenght As Integer) As DataTable
End Function
Public Function Text2Row(ByVal str As String, ByVal Before As String, ByVal after As String) As DataRow
'str=<td>alireza</td> <td>ebrahimi</td> <td>1342</td>
'Before=<td>
'After=</td>
End Function
End Class
کارها را من تقسیم بندی کرده ام تا هرکس هر بخشی را دوست دارد انجام دهد.
فرم اولیه کلاس را در زیر میبینید
روش کار اینچنین است
ابتدا پروپرتی html که از نوع string است به کلاس داده میشود.html شامل کد های html صفحه ی وب است.
پس از این کار تابع proccess بکار می افتد.
تابع proccess متن html را جستجو کرده و تمام جدول های موجود در آن را پیدا میکند. و اطلاعات مربوط به جداول را داخل متغیر آرایه ای tablelist قرار میدهد.این مشخصه ها شامل نام جدول مکان شروع جدول در html وطول آن و همچنین تعداد سطر و ستون و تعداد رکورد های آن میشود.
تابع پروسس همچنین یک مقدار عددی به متغیر tableCount میدهد که نشان دهنده ی تعداد جدول یافته شده در متن html است.
قسمت بعدی کلاس یک تابع است که با فرض اینکه tableCount نشان دهنده ی وجود حداقل یک جدول در متن کار میکند. این تابع Table2DataTableنام دارد و وضیفه اش تبدیل جدول به دیتاتیبل است .این تابع در دو حالت کار میکند .
در حالت اول با دادن ایندکس جدول مورد نظر سایر اطلاعات را از tablelist میگیرد.
در حالت دوم بطور مجزا با دادن نام متن و نقطه شروع و طول جدول خروجی اش دیتا تیبل است.
دلیل این دو گونه کارکرد این است که بتوان بطور مستقیم از این تابع در برنامه ها استفاده کرد.مثلا وقتی بطور متناوب ما اطلاعاتی را از یک صفحه ی وب در میآوریم لازم نیست همیشه آنرا پردازش کنیم.
شاد باشید
Public Class htmltable2DataTable
Public Property html() As String
Get
End Get
Set(ByVal Value As String)
proccess(Value)
End Set
End Property
Public TableCount As Integer
Public TableList(,) As String
'tablelist(,0)= table start index in html
'tablelist(,1)= table lenght in html
'tablelist(,2)= field count
'tablelist(,3)= record count
Dim position As Integer
Dim TableStart As Integer
Dim TableEnd As Integer
Dim FirstTable As Boolean
Dim i As Integer
Dim j As Integer
Public Function proccess(ByVal html As String)
position = 1
FirstTable = True
TableCount = 0
'find start of table
TableStart = InStr(position, html, "<table")
If TableStart > 0 Then
'find end of table
TableEnd = InStr(TableStart, html, "</table>")
position = TableEnd
If TableEnd > TableStart Then
'ERR
Else
If FirstTable = True Then
FirstTable = False
ReDim tablelist(1, 3)
Else
ReDim Preserve tablelist(UBound(tablelist) + 1, 3)
End If
'table start index in html
tablelist(UBound(tablelist), 0) = TableStart
'table lenght in html
tablelist(UBound(tablelist), 1) = TableEnd - TableStart + 7
'field count in one row
tablelist(UBound(tablelist), 2) = HowManyInStr(Mid(html, TableStart, InStr(TableStart, html, "</tr>") - TableStart + 4), "</td>") / 2
'record count
tablelist(UBound(tablelist), 3) = HowManyInStr(Mid(html, TableStart, TableEnd - TableStart + 7), "</tr>") / 2
TableCount = TableCount + 1
End If
End If
End Function
Private Function HowManyInStr(ByVal str As String, ByVal find As String) As Integer
End Function
Public Function Table2DataTable(ByVal TableIdx As Integer) As DataTable
Dim dr As DataRow
position = TableList(TableIdx, 0) 'table start index in html
For i = 0 To TableList(TableIdx, 3) 'record count
position = InStr(position, html, "</tr>")
Next
End Function
Public Function Table2DataTable(ByVal html As String, ByVal start As Integer, ByVal lenght As Integer) As DataTable
End Function
Public Function Text2Row(ByVal str As String, ByVal Before As String, ByVal after As String) As DataRow
'str=<td>alireza</td> <td>ebrahimi</td> <td>1342</td>
'Before=<td>
'After=</td>
End Function
End Class