どうも。とある案件で HAP で XPath 使いたかったのですが、PCL (.NET Core) では XPath がなくなっているらしく、HAP はそれをつかって XPath の実現をしているみたいなので、.NET Core (PCL) では使えないみたい。なので簡易実装をしてみた。
使い方はこんな感じ。
var config = new HtmlAgilityXPathRetriveConfig(); var func = XPathExpression.Compile<HtmlNode, HtmlNode>("/html/body/span", config); var doc = new HtmlDocument(); doc.LoadHtml("<html><head><title>test</title></head><body><span class=\"x\">content 1</span><span class=\"x\">content 2</span></body></html>"); var result = func(new[] { doc.DocumentNode }).ToArray();
config は DOM Tree を探索するための補助関数を設定するクラスです。
class HtmlAgilityXPathRetriveConfig : IXPathRetriveConfig<HtmlNode> { public Expression<Func<HtmlNode, IEnumerable<HtmlNode>>> ChildrenGetter => node => node.ChildNodes; public Expression<Func<HtmlNode, string>> TagNameGetter => node => node.Name; public Expression<Func<HtmlNode, string, string>> AttributeValueGetter => (node, name) => node.GetAttributeValue(name, string.Empty); };
中身のソースコードはまだ公開してないけど、Twitter とかで使いたいですみたいなリプあれば単独ライブラリー化も検討してる。XPath だけど、json とかそーいう系統も流用しやすいようには考えてる感じ。Config をいじればいいわけですね。コンパイルして再利用可能なので、頻繁に使う関数ならオンメモリーに確保しておくことができます。
実はこの前にパースしながら DOM ツリーを捜査するインタープリター型の実装もしてました。が、せっかくなんで真面目に実装しましたw
WinRT だと 1 度しか使わない状況ならあんま恩恵ないですね… まあ、これを使ってアセンブリーを生成するっていうのも手でしょうけど、それなら最初から人力で Linq 使えばいいじゃん、ってなるわけで…
そんなところ。