使用XPath和HtmlAgilityPack选择属性值

时间:2016-08-21 12:24:26

标签: c# html xml xpath html-agility-pack

我正在尝试使用html agility pack中的xpath表达式获取元标记的第二个属性值: 元标记:

<meta name="pubdate" content="2012-08-30" />

我正在使用的xml路径表达式:

//meta[@name='pubdate']/@content

但它不会返回任何东西。我试图搜索并实施这个解决方案:

//meta[@name='pubdate']/string(@content)

另一种方式:

string(//meta[@name='pubdate']/@content)

但它在html敏捷包中提供了xml异常。 另一种解决方案也不起作用。

//meta[@name='pubdate']/data(@content)

由于我只想使用xml路径(而不是html agility pack函数来获取属性值)。我使用的功能如下:

date = TextfromOneNode(document.DocumentNode.SelectSingleNode(".//body"), "meta[@name='pubdate']/@content");
public static string TextfromOneNode(HtmlNode node, string xmlPath)
{
    string toReturn = "";
    if(node.SelectSingleNode(xmlPath) != null)
    {
        toReturn = node.SelectSingleNode(xmlPath).InnerText;
    }
    return toReturn;
}

到目前为止,似乎无法使用xml路径表达式直接获取属性值。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

使用xml linq

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select class="form-control">
    <option value="home-none">-</option>
    <option value="home-select">Team</option>
</select>

<div class="form-group">
    <input class="form-control home" name="h-p1-fn" placeholder="First name" type="text"/>
</div>
<div class="form-group">
    <input class="form-control home" name="h-p1-ln" placeholder="Last name" type="text"/>
</div>

答案 1 :(得分:0)

有一种方法可以使用HtmlNodeNavigator

public static string TextfromOneNode(HtmlNode node, string xmlPath)
{
    string toReturn = "";
    var navigator = (HtmlAgilityPack.HtmlNodeNavigator)node.CreateNavigator();
    var result = navigator.SelectSingleNode(xmlPath);
    if(result != null)
    {
        toReturn = result.Value;
    }
    return toReturn;
}

以下控制台应用程序示例演示了HtmlNodeNavigator.SelectSingleNode()如何使用返回元素的XPath和返回属性的XPath:

var raw = @"<div>
<meta name='pubdate' content='2012-08-30' />
<span>foo</span>
</div>";
var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(raw);

var navigator = (HtmlAgilityPack.HtmlNodeNavigator)doc.CreateNavigator();

var xpath1 = "//meta[@name='pubdate']/@content";
var xpath2 = "//span";

var result = navigator.SelectSingleNode(xpath1);
Console.WriteLine(result.Value);
result = navigator.SelectSingleNode(xpath2);
Console.WriteLine(result.Value);

<强> dotnetfiddle demo

输出

2012-08-30
foo