我使用HtmlAgilityPack解析和分析HTML页面,我需要知道每个节点的“深度”--距离Body节点的距离。示例(“深度”属性仅用于说明目的):
<html>
<head></head>
<body depth="0">
<div depth="1">
<ul depth="2">
<li depth="3">
<p depth="4">foo</p>
</li>
<li depth="3">
<p depth="4">bar</p>
</li>
</ul>
</div>
</body>
</html>我试图避免两个显而易见的解决方案:
node.ParentNode来计算每个节点的“按需”深度,直到到达body。是否有办法通过使用HtmlAgilityPack在Load上收集的现有数据来避免这种情况?
发布于 2012-07-30 07:33:04
您是在问是否有内置的NodeDepth属性或类似的东西?我很肯定答案是否定的,因为计算出库解析的每个节点都会产生很少需要的开销。由于计算节点深度很容易使用一些递归,所以我认为它们不会包括默认情况。
你为什么要回避显而易见的解决方案?
发布于 2012-07-30 14:53:31
据我所知,AgilityPack不存储节点的深度。
如果您想获得所有节点的深度,假设编写递归方法(例如从根节点开始,并通过递归调用当前节点子节点来增加深度)会更容易。
至于单个节点的深度计算,您可以使用HtmlNode.XPath属性,并计算这个值中的斜杠数(/)。这将是节点深度。在您的例子中,您应该首先计算<body>节点的深度,然后从欲望节点的深度减去这个值,以获得相对深度
var bodyDepth = doc.DocumentNode
.SelectSingleNode("//body")
.XPath
.Count(c => c == '/');
var paragraphDepth = doc.DocumentNode
.SelectSingleNode("//p")
.XPath
.Count(c => c == '/');
var result = paragraphDepth - bodyDepth;这将为您提供4,但我不确定这是否比遍历ParentNode属性更容易。
发布于 2014-10-31 06:06:16
HtmlAgilityPack不会给出深度细节。我们可以使用上面提供的'/‘字符计数从XPath变量中获得它。我们不需要为了获取细节而遍历父母。
foreach (HtmlNode rootNode in document.DocumentNode.Descendants())
{
levels.Add(rootNode.XPath.Count(x => x == '/'));
}应该管用的。
https://stackoverflow.com/questions/11717059
复制相似问题