使用XPath和HtmlAgilityPack選擇屬性值

c# html html-agility-pack xml xpath

我試圖使用html敏捷包中的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路徑表達式直接獲取屬性值。有任何想法嗎?

一般承認的答案

有一種方法可以使用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");
        }
    }
}



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因