2012-05-29 38 views
5

Chúng tôi có một tài liệu trợ giúp cực lớn được tạo trong Word và được sử dụng để tạo ra một tài liệu HTM thậm chí lớn hơn và không đáng sợ. Sử dụng C# và thư viện này, tôi chỉ muốn lấy và hiển thị một phần của tệp này tại bất kỳ thời điểm nào trong ứng dụng của tôi. Phần được chia ra như thế này:Lấy nội dung giữa hai thẻ HTML bằng cách sử dụng Html Agility Pack

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

nói cách logic, có một H1 với một tên phần trong một thẻ a. Tôi muốn chọn tất cả mọi thứ từ bên ngoài chứa div cho đến khi tôi gặp phải h1 và loại trừ div đó.

  • Mỗi Section Name nằm trong một thẻ <a> dưới một h1 trong đó có nhiều trẻ em (khoảng 6 mỗi)
  • Phần logic được đánh dấu với ý kiến ​​
  • Những bình luận không tồn tại trong các tài liệu thực tế

nỗ lực của tôi:

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

Sine Tôi không thể tìm thấy tài liệu về điều này, tôi không biết làm thế nào tôi có thể nhận được từ nút bắt đầu của tôi đến phần tử h1 tiếp theo. Mọi lơi đê nghị đêu nên được đanh gia cao.

Trả lời

5

Tôi nghĩ rằng điều này sẽ làm điều đó, mặc dù nó giả định rằng thẻ H1 chỉ xuất hiện trong phần đầu. Nếu đó không phải là trường hợp, bạn có thể thêm một nơi trên con cháu để kiểm tra các bộ lọc khác trên bất kỳ nút H1 nó tìm thấy. Lưu ý rằng điều này sẽ bao gồm tất cả các anh chị em của div nó tìm thấy cho đến khi nói đến cái tiếp theo với một tên phần.

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

Rất đẹp. Tôi đã phải thay đổi bộ lọc một chút vì tôi có nhiều div với các tên phần trong tài liệu. Tôi đã kết thúc bằng cách sử dụng 'HtmlNode startNode = helpDocument.DocumentNode.Descendants (" h1 "). Ở đâu (d => d.InnerText.Contains (SectionName)). FirstOrDefault();' và di chuyển đến nút cha từ đó. Phần còn lại của nó hoạt động hoàn hảo.Thanks – Rondel

+0

Tuyệt vời. Tôi rất vui vì đã làm việc. –

0

Vì vậy, những gì bạn thực sự muốn kết quả là div xung quanh thẻ h1? Nếu có, thì điều này sẽ hoạt động.

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

Cũng hoạt động với SelectNodes tùy thuộc vào Html của bạn. Như thế này:

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

Oh, và trong khi thử nghiệm này, tôi nhận thấy rằng điều không làm việc cho tôi là dấu chấm trong chứa phương pháp, một khi tôi thay đổi nó để tên rằng tất cả đều hoạt động tốt.

+0

Không hoàn toàn. Tôi muốn các div xung quanh thẻ 'h1', nhưng tôi cũng muốn nhận được tất cả các div trong tương lai/kéo dài cho đến khi div xung quanh của thẻ' h1' tiếp theo. Cảm ơn mặc dù. – Rondel

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