我想从xhtml字符串中提取标题标签(即h1,h2,h3等)中的所有内容,然后在侧面菜单中使用。
xhtml字符串将带有编号的标题,因此h2类似于“ 1.1 Heading”,在其下的h3则具有“ 1.1.1 Heading”和1.1.2,依此类推。
<div class="main-body">
<h2>1.1 Heading</h2>
<h3>1.1.1 Subheading</h3>
<p>Lorem ipsum</p>
<h3>1.1.2 Another Subheading</h3>
<p>Lorem ipsum</p>
<h2>2.1 Heading</h2>
<h3>2.1.1 Subheading</h3>
<p>Lorem ipsum</p>
<h4>2.1.1.1 SubSubHeading</h4>
</div>
以上是html外观的一个示例,因此我想将其父级(h2)与子级(h3,h4)组合在一起,当在DOM中找到新的h2时,我想创建一个新的包含“孩子”的组。
答案 0 :(得分:0)
您可以通过两种方式将<h1>
内的所有文本检索到<h6>
标签
因此,您输入的html是:
string input = @"<div class='main - body'>
<h2> 1.1 Heading </h2>
<h3> 1.1.1 Subheading </h3>
<p> Lorem ipsum </ p >
<h3> 1.1.2 Another Subheading</h3>
<p> Lorem ipsum </p>
<h2> 2.1 Heading </h2>
<h3> 2.1.1 Subheading </h3>
<p> Lorem ipsum </p>
<h4> 2.1.1.1 SubSubHeading </h4>
</div> ";
1)使用正则表达式:
使用此正则表达式将标题标签内的所有文本从<h1>
移至<h6>
<h[1-6][^>]*?>(?<TagText>.*?)</h[1-6]>
用法:
string pattern = @"<h[1-6][^>]*?>(?<TagText>.*?)</h[1-6]>";
MatchCollection matches = Regex.Matches(input, pattern);
var heading_matches = matches.Cast<Match>().Select(x => x.Groups["TagText"].Value);
要忽略h1
,然后使用
string pattern = @"<h[2-6][^>]*?>(?<TagText>.*?)</h[2-6]>";
2)通过使用HtmlAgilityPack:
使用HtmlAgilityPack包检索<h1>
至<h6>
中的所有文本。
您需要从NuGet软件包管理器控制台安装此软件包。
Install-Package HtmlAgilityPack -Version 1.8.14
用法:
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(input);
string xpathQuery = "//*[starts-with(name(),'h') and string-length(name()) = 2 and number(substring(name(), 2)) <= 6]";
var texts = htmlDocument.
DocumentNode
.SelectNodes(xpathQuery)
.Select(x => x.InnerText)
.ToList();
要忽略h1
,然后使用
string xpathQuery = "//*[starts-with(name(),'h') and string-length(name()) = 2 and number(substring(name(), 2)) > 1 and number(substring(name(), 2)) <= 6]";
输出:(来自调试器)