【发布时间】:2015-06-30 09:23:09
【问题描述】:
我得到了需要解析的 HTML,我正在使用 C# 和 Html Agility Pack Library 来选择节点。我的 html 看起来像这样:
<input data-translate-atrr-placeholder="FORGOT_PASSWORD.FORM.EMAIL">
或:
<h1 data-translate="FORGOT_PASSWORD.FORM.EMAIL"></h1>
data-translate-attr-**** 是我需要找到的新属性模式
我可以使用这样的东西:
//[contains(@??,'data-translate-attr')]
但不幸的是,这只会在属性内搜索值。 如何使用通配符查找属性本身?
更新:@Mathias Muller
HtmlAgilityPack.HtmlDocument htmlDoc
// this is the old code (returns nodes)
var nodes = htmlDoc.DocumentNode.SelectNodes("//@data-translate");
// these suggestions return no nodes using the same data
var nodes = htmlDoc.DocumentNode.SelectNodes("//@*[contains(name(),'data-translate')]");
var nodes = htmlDoc.DocumentNode.SelectNodes("//@*[starts-with(name(),'data-translate')]");
更新 2
这似乎是一个 Html Agility Pack 问题而不是 XPath 问题,我使用 chrome 来测试我的 XPath 表达式,并且以下所有内容都在 chrome 中工作,但在 Html Agility Pack 中没有:
//@*[contains(local-name(),'data-translate')]
//@*[starts-with(name(),'data-translate')]
//attribute::*[starts-with(local-name(.),'data-translate')]
我的解决方案
我最终只是按照老式的方式做事......
var nodes = htmlDoc.DocumentNode.SelectNodes("//@*");
if (nodes != null) {
foreach (HtmlNode node in nodes) {
if (node.HasAttributes) {
foreach (HtmlAttribute attr in node.Attributes) {
if (attr.Name.StartsWith("data-translate")) {
// code in here to handle translation node
}
}
}
}
}
【问题讨论】:
标签: c# html xpath html-agility-pack