2012-05-29 18 views
5

का उपयोग कर दो एचटीएमएल टैग के बीच सामग्री प्राप्त करना हमारे पास वर्ड में बनाया गया एक बहुत बड़ा सहायता दस्तावेज़ है और इसका उपयोग एक और अधिक बड़े पैमाने पर और अविश्वसनीय रूप से एचटीएम दस्तावेज़ उत्पन्न करने के लिए किया गया था। सी # और इस लाइब्रेरी का उपयोग करके, मैं केवल अपने आवेदन के किसी भी बिंदु पर इस फ़ाइल के एक खंड को पकड़ और प्रदर्शित करना चाहता हूं। धारा इस तरह विभाजित कर रहे हैं:एचटीएमएल एजिलिटी पैक

<!--logical section starts here --> 
<div> 
<h1><span style='mso-spacerun:yes'></span><a name="_Toc325456104">Section A</a></h1> 
</div> 
<div> Lots of unnecessary markup for simple formatting... </div> 
..... 
<!--logical section ends here --> 

<div> 
<h1><span style='mso-spacerun:yes'></span><a name="_Toc325456104">Section B</a></h1> 
</div> 

तार्किक रूप से, वहाँ एक a टैग में एक अनुभाग नाम के साथ एक H1। मैं बाहरी युक्त div से सबकुछ चुनना चाहता हूं जब तक कि मुझे कोई अन्य h1 न मिले और उस div को बाहर कर दें।

  • हर अनुभाग के नाम एक h1 जो कई बच्चों (के बारे में 6 प्रत्येक)
  • तार्किक खंड टिप्पणियों के साथ चिह्नित है
  • इन टिप्पणियों वास्तविक दस्तावेज़
  • में मौजूद नहीं है है के तहत एक <a> टैग में स्थित है

मेरे प्रयास:

var startNode = helpDocument.DocumentNode.SelectSingleNode("//h1/a[contains(., '"+sectionName+"')]"); 
//go up one level from the a node to the h1 element 
startNode=startNode.ParentNode; 

//get the start index as the index of the div containing the h1 element 
int startNodeIndex = startNode.ParentNode.ChildNodes.IndexOf(startNode); 

//here I am not sure how to get the endNode location. 
var endNode =?; 

int endNodeIndex = endNode.ParentNode.ChildNodes.IndexOf(endNode); 

//select everything from the start index to the end index 
var nodes = startNode.ParentNode.ChildNodes.Where((n, index) => index >= startNodeIndex && index <= endNodeIndex).Select(n => n); 

साइन मैं इस पर दस्तावेज नहीं ढूंढ पा रहा हूं, मुझे नहीं पता कि मैं अपने प्रारंभ नोड से अगले एच 1 तत्व में कैसे प्राप्त कर सकता हूं। किसी भी सुझाव की सराहना की जाएगी।

उत्तर

5

मुझे लगता है कि यह ऐसा करेगा, हालांकि यह मानता है कि एच 1 टैग केवल सेक्शन हेड में दिखाई देते हैं। यदि ऐसा नहीं है, तो आप किसी भी एच 1 नोड्स पर अन्य फ़िल्टरों की जांच के लिए वंशजों पर कहां जोड़ सकते हैं। ध्यान दें कि इसमें div के सभी भाई बहन शामिल होंगे जब तक यह किसी अनुभाग के नाम के साथ अगले के लिए नहीं आता है।

private List<HtmlNode> GetSection(HtmlDocument helpDocument, string SectionName) 
{ 
    HtmlNode startNode = helpDocument.DocumentNode.Descendants("div").Where(d => d.InnerText.Equals(SectionName, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); 
    if (startNode == null) 
     return null; // section not found 

    List<HtmlNode> section = new List<HtmlNode>(); 
    HtmlNode sibling = startNode.NextSibling; 
    while (sibling != null && sibling.Descendants("h1").Count() <= 0) 
    { 
     section.Add(sibling); 
     sibling = sibling.NextSibling; 
    } 

    return section; 
} 
+0

अच्छा। मुझे फ़िल्टर को थोड़ा बदलना पड़ा क्योंकि मेरे पास दस्तावेज़ में सेक्शन नामों के साथ कई divs थे। मैं 'HtmlNode startNode = helpDocument.DocumentNode.Descendants ("h1") का उपयोग करके समाप्त हुआ। कहां (डी => डी। इनरटेक्स्ट। कंटेनर (सेक्शननाम))। फर्स्टऑर्डडिल्ट();' और वहां से पैरेंट नोड तक जा रहा है। बाकी सब ने पूरी तरह से काम किया। धन्यवाद – Rondel

+0

उत्कृष्ट। मैं बहुत खुश हूं कि काम किया। –

0

तो, आप वास्तव में परिणाम के रूप में क्या चाहते हैं एच 1-टैग के आसपास div है? यदि हां, तो यह काम करना चाहिए।

helpDocument.DocumentNode.SelectSingleNode("//h1/a[contains(@name, '"+sectionName+"')]/ancestor::div"); 

इसके अलावा SelectNodes अपने HTML पर निर्भर करता है के साथ काम करता है। इस तरह:

helpDocument.DocumentNode.SelectNodes("//h1/a[starts-with(@name,'_Toc')]/ancestor::div"); 

ओह, और जब तक इस परीक्षण मैंने देखा है कि मेरे लिए काम नहीं बात डॉट था में, विधि में शामिल है एक बार मैं इसे नाम करने के लिए बदल विशेषता सब कुछ ठीक काम करता है।

+0

काफी नहीं। मैं 'h1' टैग के आस-पास div चाहता हूं, लेकिन मैं अगले भविष्य के div के आसपास के div तक सभी भावी divs/spans को भी प्राप्त करना चाहता हूं। हालांकि धन्यवाद। – Rondel

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