使用 XPath 和 HtmlAgilityPack 选择属性值
Selecting attribute value using XPath and HtmlAgilityPack
我正在尝试使用 html 敏捷包中的 xpath 表达式获取元标记的第二个属性值:
元标记:
<meta name="pubdate" content="2012-08-30" />
我正在使用的 xml 路径表达式:
//meta[@name='pubdate']/@content
但它没有 return 任何东西。我尝试四处搜索并实施此解决方案:
//meta[@name='pubdate']/string(@content)
另一种方式:
string(//meta[@name='pubdate']/@content)
但它在 html 敏捷包中给出了 xml 例外。
另一个解决方案也不起作用。
//meta[@name='pubdate']/data(@content)
出于某些原因,我只想使用 xml 路径(而不是 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 路径表达式直接获取属性值。
有什么想法吗?
使用 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");
}
}
}
有一种方法可以使用 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()
如何与 return 元素的 XPath 和 return 属性的 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);
输出:
2012-08-30
foo
我正在尝试使用 html 敏捷包中的 xpath 表达式获取元标记的第二个属性值: 元标记:
<meta name="pubdate" content="2012-08-30" />
我正在使用的 xml 路径表达式:
//meta[@name='pubdate']/@content
但它没有 return 任何东西。我尝试四处搜索并实施此解决方案:
//meta[@name='pubdate']/string(@content)
另一种方式:
string(//meta[@name='pubdate']/@content)
但它在 html 敏捷包中给出了 xml 例外。 另一个解决方案也不起作用。
//meta[@name='pubdate']/data(@content)
出于某些原因,我只想使用 xml 路径(而不是 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 路径表达式直接获取属性值。 有什么想法吗?
使用 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");
}
}
}
有一种方法可以使用 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()
如何与 return 元素的 XPath 和 return 属性的 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);
输出:
2012-08-30
foo