0

我有一些混合了文本和链接的html,我想提取文本与链接的单词一样,而不必删除链接并稍后做一些疯狂的事情将其放回同一个地方。

HTML 如下所示:

<div id="i want what is inside here">
<h3>some text</h3>
<div>more text with a <a href="url">link</a></div>
<p>some more text<br />
<a href="url">another link</a> here...</p>
</div>

我想要的输出是:

some text
more text with a <a href="url">link</a>
some more text
<a href="url">another link</a> here...

我知道如何使用 HTMLAgilityPack 提取文本最近我学到了很多关于如何使用祖先的新东西,先于 xpath 和其他一些东西,这让我想知道:

是否可以使用 xpath 来获得上述所需的输出,或者我应该怎么做?

如果没有可用的 xpath 条件,我正在考虑提取文本然后提取链接并用链接替换文本上的链接内部文本匹配(我认为不可靠)但这是我认为可能的一种方式完成了,你会建议我做什么?

4

1 回答 1

2

XPath,即 XML 路径语言,是一种用于从 XML 文档中选择节点的查询语言。

您需要根据您的规则转换您的文档。您可以使用 xpath 选择应转换的节点,但不能使用 xpath 执行此转换。

为此,您可以从最深到根节点遍历文档节点,如果这不是<a>标签,则将其替换为它的内部 HTML。

幸运的是,AgilityPack 似乎按照在文档中找到的节点的顺序来枚举节点。这意味着可以通过反转节点列表来检索必要的顺序。看:

// getting the non-anchor nodes in the reversed order
var nodes = doc.DocumentNode.SelectNodes("//*[name()!='a']")
    .Reverse()
    .ToList();

// replacing with the inner html
foreach (var node in nodes)
{
    var replacement = doc.CreateTextNode(node.InnerHtml);
    node.ParentNode.ReplaceChild(replacement, node);
}

// and getting the output
var output = doc.DocumentNode.OuterHtml;

这会给你这样的东西:

some text
more text with a <a href='url'>link</a>
some more text
<a href='url'>another link</a> here...

但请注意,转换后的文档变成了整个文本节点。如果您需要将其作为 HTML 片段使用,则必须从修改后的文档中创建一个新文档。

于 2012-07-30T16:51:15.323 回答