モノトーンの伝説日記

OBS Studio と Blackmagic Design が大好き。

<mini> HtmlAgilityPack 「でも」使える XPath Parser/Builder 作りました

 どうも。とある案件で 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 使えばいいじゃん、ってなるわけで…

 そんなところ。