使用Html Agility Pack在兩個HTML標記之間獲取內容

.net c# html-agility-pack

我們在Word中創建了一個絕對龐大​​的幫助文檔,這個文檔用於生成更大規模且非常複雜的HTM文檔。使用C#和這個庫,我只想在我的應用程序中的任何一點抓取並顯示該文件的一部分。部分分為這樣:

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

  • 每個Section Name都位於h1下的一個<a>標籤中,該標籤有多h1 (每個大約6個)
  • 邏輯部分標有註釋
  • 實際文檔中不存在這些註釋

我的嘗試:

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

我無法找到關於此的文檔,我不知道如何從我的起始節點到下一個h1元素。任何建議,將不勝感激。

一般承認的答案

我想這會做到這一點,雖然它假設H1標籤只出現在節頭中。如果不是這種情況,您可以在後代上添加Where以檢查它找到的任何H1節點上的其他過濾器。請注意,這將包括它找到的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;
}

熱門答案

那麼,你真正想要的是h1-Tag周圍的div?如果是,那麼這應該有效。

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

也適用於SelectNodes具體取決於您的Html。喜歡這個:

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

哦,在測試這個時,我發現不適合我的東西是contains方法中的點,一旦我將它更改為name屬性,一切正常。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因