2016-11-07 20 views
5

Tôi đang cố gắng phân tích cú pháp phản hồi HTML cho một vài giá trị và sau đó chèn chúng vào SQL. Tôi có thể nhận được cả hai giá trị nhưng, bởi vì mã được bọc trong một tuyên bố foreach, tôi nhận được chúng hai lần.Nhận các giá trị HTML từ phản hồi web

Đây là phản ứng HTML của tôi

<div align="CENTER" class='dataTitle'>Host State Breakdowns:</div> 
<p align='center'> 
<a href='trends.cgi?host=hostname&includesoftstates=no&assumeinitialstates=yes&initialassumedhoststate=0&backtrack=4'><img src='trends.cgi?createimage&host=hostname&includesoftstates=no&initialassumedhoststate=0&backtrack=4' border="1" alt='Host State Trends' title='Host State Trends' width='500' height='20'></a><br> 
</p> 
<div align="CENTER"> 
<table border="0" class='data'> 
<tr><th class='data'>State</th><th class='data'>Type/Reason</th><th class='data'>Time</th><th class='data'>% Total Time</th><th class='data'>% Known Time</th></tr> 
<tr class='dataEven'><td class='hostUP' rowspan="3">UP</td><td class='dataEven'>Unscheduled</td><td class='dataEven'>0d 10h 5m 19s</td><td class='dataEven'>100.000%</td><td class='dataEven'>100.000%</td></tr> 
<tr class='dataEven'><td class='dataEven'>Scheduled</td><td class='dataEven'>0d 0h 0m 0s</td><td class='dataEven'>0.000%</td><td class='dataEven'>0.000%</td></tr> 
<tr class='hostUNREACHABLE'><td class='hostUNREACHABLE'>Total</td><td class='hostUNREACHABLE'>0d 0h 0m 0s</td><td class='hostUNREACHABLE'>0.000%</td><td class='hostUNREACHABLE'>0.000%</td></tr> 
<tr class='dataOdd'><td class='dataOdd' rowspan="3">Undetermined</td><td class='dataOdd'>Nagios Not Running</td><td class='dataOdd'>0d 0h 0m 0s</td><td class='dataOdd'>0.000%</td><td class='dataOdd'></td></tr> 
<tr class='dataOdd'><td class='dataOdd'>Insufficient Data</td><td class='dataOdd'>0d 0h 0m 0s</td><td class='dataOdd'>0.000%</td><td class='dataOdd'></td></tr> 
<tr class='dataOdd'><td class='dataOdd'>Total</td><td class='dataOdd'>0d 0h 0m 0s</td><td class='dataOdd'>0.000%</td><td class='dataOdd'></td></tr> 
<tr><td colspan="3"></td></tr> 
<tr class='dataEven'><td class='dataEven'>All</td><td class='dataEven'>Total</td><td class='dataEven'>0d 10h 5m 19s</td><td class='dataEven'>100.000%</td><td class='dataEven'>100.000%</td></tr> 
</table> 
</div> 
<br><br> 
<div align="CENTER" class='dataTitle'>State Breakdowns For Host Services:</div> 
<div align="CENTER"> 
<table border="0" class='data'> 
<tr><th class='data'>Service</th><th class='data'>% Time OK</th><th class='data'>% Time Warning</th><th class='data'>% Time Unknown</th><th class='data'>% Time Critical</th><th class='data'>% Time Undetermined</th></tr> 
<tr class='dataOdd'><td class='dataOdd'><a href='avail.cgi?host=hostname&service=servicename&t1=1478498400&t2=1478534719&backtrack=4&assumestateretention=yes&assumeinitialstates=yes&assumestatesduringnotrunning=yes&initialassumedhoststate=0&initialassumedservicestate=0&show_log_entries&showscheduleddowntime=yes&rpttimeperiod=24x7'>servicename</a></td><td class='serviceOK'>100.000% (100.000%)</td><td class='serviceWARNING'>0.000% (0.000%)</td><td class='serviceUNKNOWN'>0.000% (0.000%)</td><td class='serviceCRITICAL'>0.000% (0.000%)</td><td class='dataOdd'>0.000%</td></tr> 
<tr class='dataEven'><td class='dataEven'><a href='avail.cgi?host=hostname&service=servicename2&t1=1478498400&t2=1478534719&backtrack=4&assumestateretention=yes&assumeinitialstates=yes&assumestatesduringnotrunning=yes&initialassumedhoststate=0&initialassumedservicestate=0&show_log_entries&showscheduleddowntime=yes&rpttimeperiod=24x7'>servicename2</a></td><td class='serviceOK'>100.000% (100.000%)</td><td class='serviceWARNING'>0.000% (0.000%)</td><td class='serviceUNKNOWN'>0.000% (0.000%)</td><td class='serviceCRITICAL'>0.000% (0.000%)</td><td class='dataEven'>0.000%</td></tr> 
</table> 
</div> 

Đây là mã của tôi:

var response = (HttpWebResponse)request.GetResponse(); 
var stream = response.GetResponseStream(); 
HtmlDocument doc = new HtmlDocument(); 
doc.Load(stream); 

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//table[@class]")) 
{ 

    foreach (HtmlNode node2 in node.SelectNodes("//td[@class = 'serviceOK']")) 
    { 
     var value = node2.InnerText; 
    } 

    foreach (HtmlNode node3 in node.SelectNodes("//a[contains(@href, 'avail.cgi')]")) 
    { 
     var name = node3.InnerText; 
    } 

} 

tên cho thấy servicename và giá trị cho thấy serviceOK lớp nhưng nó lặp lại một lần nữa vì sự foreach đầu tiên.

kết quả của tôi trông như thế này:

100.000% (100.000%) 
100.000% (100.000%) 
servicename 
servicename2 
100.000% (100.000%) 
100.000% (100.000%) 
servicename 
servicename2 

Có cách nào để, thứ nhất, phù hợp với giá trị lên, và hai, chỉ có chúng hiển thị một lúc?

Trả lời

3

Cuộc tranh luận đầu tiên của bạn vượt qua toàn bộ tài liệu cũng như cả hai điều khoản báo cáo khác của bạn trong phần đầu tiên.
Bởi vì có 2 yếu tố phù hợp với bảng biểu thức XPath của bạn

"//table[@class]" 

bạn đang nhận được câu trả lời của bạn hai lần. Nếu bạn có nhiều phần tử bảng phù hợp với biểu thức XPath của bạn, ví dụ 7 chẳng hạn, bạn sẽ nhận được kết quả 7 lần.

Điều bạn muốn là tìm tất cả các bảng phân chia (td) với lớp "serviceOK" nằm trong một hàng trong bảng (tr) trong một bảng. Một khi bạn có HtmlNode này, bạn có thể chỉ cần đi đến anh chị em trước đó sẽ chứa tên dịch vụ.

var response = (HttpWebResponse)request.GetResponse(); 
var stream = response.GetResponseStream(); 
HtmlDocument doc = new HtmlDocument(); 
doc.Load(stream); 

foreach (HtmlNode serviceOkNode in doc.DocumentNode.SelectNodes("//table[@class]/tr/td[@class = 'serviceOK']")) 
{ 
    HtmlNode serviceNameNode = serviceOkNode.PreviousSibling; 
    var value = serviceOkNode.InnerText; 
    var name = serviceNameNode.InnerText; 
} 
+0

wow cảm ơn bạn rất nhiều. Tôi biết foreach đầu tiên đã ném tôi ra nhưng tôi không thể tìm ra những gì tôi cần thiết để sử dụng cho các SelectNodes. Cám ơn bạn một lần nữa – maltman

Các vấn đề liên quan