使用XPath和HtmlAgilityPack选择属性值

本文关键字:属性 选择 HtmlAgilityPack XPath 使用 | 更新日期: 2023-09-27 18:03:28

我试图在html敏捷包中使用xpath表达式获得元标签的第二个属性值:meta标签:

<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 path(而不是html敏捷包函数来获取属性值)。我使用的函数如下:

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路径表达式直接获得属性值。什么好主意吗?

使用XPath和HtmlAgilityPack选择属性值

有一种方法使用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演示

输出:

2012-08-30
foo

使用xml linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "<meta name='"pubdate'" content='"2012-08-30'" />";
            XElement meta = XElement.Parse(input);
            DateTime output = (DateTime)meta.Attribute("content");
        }
    }
}