XPathとHtmlAgilityPackを使用して属性値を選択する

c# html html-agility-pack xml xpath

質問

html agility packのxpath式を使用してメタタグの2番目の属性値を取得しようとしています。メタタグ:

<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 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;
}

次のコンソールアプリケーションの例は、要素を返すXPathと属性を返すXPathの両方でHtmlNodeNavigator.SelectSingleNode()どのようにHtmlNodeNavigator.SelectSingleNode()するかを示しています。

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は合法ですか? はい、理由を学ぶ