2016-11-07 6 views
5

से HTML मान प्राप्त करें मैं कुछ मानों के लिए एक HTML प्रतिक्रिया पार्स करने और फिर उन्हें SQL में डालने का प्रयास कर रहा हूं। मैं दोनों मान प्राप्त करने में सक्षम हूं लेकिन, क्योंकि कोड एक foreach कथन में लपेटा गया है, मैं उन्हें दो बार मिलता है।वेब प्रतिक्रिया

यहाँ मेरी HTML उत्तर

<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> 

यहाँ मेरी कोड है:

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; 
    } 

} 

नाम SERVICENAME पता चलता है और मूल्य वर्ग serviceOK से पता चलता है, लेकिन यह पहली foreach की वजह से फिर से स्वयं को दोहराता है।

मेरे परिणाम इस तरह दिखेगा:

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

वहाँ एक रास्ता है, पहले, मूल्यों से मेल है, और दो, केवल उन्हें एक बार दिखा है?

उत्तर

3

आपका पहला foreach पूरे दस्तावेज़ के रूप में पहले के अंदर आपके अन्य foreach स्टेटमेंट्स के रूप में पूरे दस्तावेज़ को पार करता है।
क्योंकि वहाँ 2 तालिका अपने XPath अभिव्यक्ति मिलान तत्व हैं

"//table[@class]" 

आप दो बार आपका जवाब हो रही है। यदि आपके XPath अभिव्यक्ति से मेल खाने वाले अधिक टेबल तत्व हैं, तो उदाहरण के लिए 7 कहें, आपको परिणाम 7 बार मिलेगा।

आप जो चाहते हैं वह सभी तालिका डिवीजन (टीडी) कक्षा "serviceOK" के साथ है जो एक तालिका पंक्ति में एक पंक्ति पंक्ति (tr) के भीतर हैं। एक बार आपके पास यह HTML HTML हो जाने के बाद आप पिछले भाई पर जा सकते हैं जिसमें सेवा का नाम होगा।

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

वाह आपको बहुत बहुत धन्यवाद। मुझे पता था कि पहला foreach मुझे फेंक रहा था, लेकिन मैं यह नहीं समझ सका कि मुझे SelectNodes के लिए उपयोग करने की आवश्यकता है। फिर से धन्यवाद – maltman

संबंधित मुद्दे