Python ライブラリのBeautiful Soupを .NET に移植する可能性を調査しています。主な理由は、私はパーサーが大好きで、.NET フレームワークには優れた HTML パーサーがないからです (Html Agility Pack は時代遅れで、バグが多く、文書化されておらず、正確なスキーマがわからないとうまく機能しません)。
私の主な目標の 1 つは、基本的な DOM 選択機能を BeautifulSoup の美しさとシンプルさに匹敵するものにすることです。これにより、開発者は式を簡単に作成して、探している要素を見つけることができます。
BeautifulSoup はこれを実現するために、緩やかなバインディングと名前付きパラメーターを利用しています。たとえば、単語fooを含むofおよび aをa
持つすべてのタグを検索するには、次のようにします。id
test
title
soup.find_all('a', id='test', title=re.compile('foo'))
ただし、C# には、任意の数の名前付き要素という概念がありません。.NET4 ランタイムには名前付きパラメーターがありますが、既存のメソッド プロトタイプと一致する必要があります。
私の質問:この Pythonic 構造に最も類似する C# の設計パターンは何ですか?
いくつかのアイデア:
開発者としてのコーディング方法に基づいて、これを実行したいと思います。これを実装することは、この投稿の範囲外です。私が考えている 1 つのアイデアは、匿名型を使用することです。何かのようなもの:
soup.FindAll("a", new { Id = "Test", Title = new Regex("foo") });
この構文は Python の実装と大まかに一致しますが、まだいくつかの欠点があります。
- 実装では、
FindAll
リフレクションを使用して匿名型を解析し、任意のメタデータを合理的な方法で処理する必要があります。 FindAll
プロトタイプは を取る必要があるため、Object
文書化された動作に精通していない限り、メソッドの使用方法がかなり不明確になります。匿名型を取る必要があるメソッドを宣言する方法があるとは思いません。
私が持っていた別のアイデアは、おそらくこれを処理する .NET の方法ですが、ライブラリの Python のルーツからさらに離れています。それは流暢なパターンを使用することです。何かのようなもの:
soup.FindAll("a")
.Attr("id", "Test")
.Attr("title", new Regex("foo"));
これには、式ツリーを構築し、DOM で適切なノードを見つける必要があります。
3 番目で最後のアイデアは、LINQ を使用することです。何かのようなもの:
var nodes = (from n in soup
where n.Tag == "a" &&
n["id"] == "Test" &&
Regex.Match(n["title"], "foo").Success
select n);
Python コードを C# に移植した経験のある方からの洞察、またはこの状況を処理するための最善の方法に関する全体的な推奨事項をいただければ幸いです。