Ich versuche, den zweiten Attributwert eines Meta-Tags mithilfe eines xpath-Ausdrucks in html agility pack zu erhalten: Das Meta-Tag:
<meta name="pubdate" content="2012-08-30" />
Der XML-Pfadausdruck, den ich verwende:
//meta[@name='pubdate']/@content
Aber es gibt nichts zurück. Ich habe versucht, diese Lösung zu suchen und umzusetzen:
//meta[@name='pubdate']/string(@content)
Ein anderer Weg:
string(//meta[@name='pubdate']/@content)
Aber es gibt eine XML-Ausnahme im HTML-Agility-Paket. Eine andere Lösung hat nicht so gut funktioniert.
//meta[@name='pubdate']/data(@content)
Aus Gründen wollte ich nur Xml-Pfad (und nicht HTML-Agilität Pack-Funktionen verwenden, um den Attributwert zu erhalten). Die Funktion, die ich verwende, ist unten:
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;
}
Bis jetzt sieht es so aus, als ob es keine Möglichkeit gibt, den XML-Pfad-Ausdruck zu verwenden, um einen Attributwert direkt zu erhalten. Irgendwelche Ideen?
Es gibt einen Weg mit 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;
}
Im folgenden Beispiel für eine Konsolenanwendung wird HtmlNodeNavigator.SelectSingleNode()
wie HtmlNodeNavigator.SelectSingleNode()
sowohl mit XPath als auch mit dem zurückgegebenen XPath-Attribut funktioniert:
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);
Ausgabe :
2012-08-30
foo
Verwenden von 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");
}
}
}