2012-05-29 18 views
5

Word'de oluşturulan çok büyük bir yardım belgesine sahibiz ve bu daha da büyük ve aykırı bir HTM belgesi oluşturmak için kullanıldı. C# ve bu kütüphaneyi kullanarak, yalnızca bu dosyanın bir bölümünü uygulamamın herhangi bir noktasında tutup görüntülemek istiyorum. Bölümler böyle bölünür:İki HTML etiketi arasında içerik bulma 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> 

Mantıken konuşma, bir a etiketinde bir bölüm adının bulunduğu bir H1 yoktur. Başka bir h1 ile karşılaşana ve bu div'u hariç tutmadan, dıştaki div'den her şeyi seçmek istiyorum.

  • Her Bölüm Adı mantıksal bölüm
  • Bu yorumlar gerçek belgede
  • bulunmayan yorumlarla işaretlenmiştir çoklu çocuk (yaklaşık 6 her)
  • olan bir h1 altında <a> etiketi bulunan

girişimim:

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 Bu konuyla ilgili belgeleri bulamadım, başlangıç ​​düğümünden sonraki h1 öğesine nasıl ulaşabileceğimi bilmiyorum. Herhangi bir öneri takdir edilecektir.

cevap

5

Bunu yapacağım, ancak H1 etiketlerinin yalnızca bölüm kafalarında göründüğünü varsayar. Durum böyle değilse, bulduğu herhangi bir H1 düğümündeki diğer filtreleri kontrol etmek için alt kısımda bir Nerede ekleyebilirsiniz. Bunun, bir bölüm adıyla bir sonraki adıma gelene kadar bulduğu divun tüm kardeşlerini içereceğini unutmayı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

Güzel. Filtreyi biraz değiştirmek zorunda kaldım çünkü dokümanda bölüm adları ile birden çok div vardı. HtmlNode startNode = helpDocument.DocumentNode.Descendants ("h1") kullanarak bitti.Name (d => d.InnerText.Contains (SectionName)) FirstOrDefault(); 've oradan ana düğüme kadar hareket. Geri kalanı mükemmel çalıştı. – Rondel

+0

Mükemmel. Çalıştığıma çok sevindim. –

0

Peki, sonuç olarak istediğiniz şey h1-Tag etrafında div? Evet ise, o zaman bu işe yarayacak.

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

Ayrıca SelectNodes sizin Html bağlı çalışır. Bunun gibi :

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

Oh, ve bu test ederken ben her şey çalışıyor öznitelik adını değiştirdikten sonra, yöntem içerir beni çalışmayan şey nokta olduğunu fark ettim.

+0

Tam olarak değil. 'H1' etiketini çevreleyen div istiyorum, ama ayrıca gelecek h1' etiketinin çevresindeki div'a kadar gelecekteki tüm div/up'ları da almak istiyorum. Yine de teşekkürler. – Rondel