HtmlAgilityPack:xpathと正規表現


質問

私は現在、xpathクエリを介して特定のコンテンツを検索するためにHtmlAgilityPackを使用しています。このようなもの:

var col = doc.DocumentNode.SelectNodes("//*[text()[contains(., 'foo'] or @*....

今、私は、正規表現を使用して、すべてのHTMLソースコード(=テキスト、タグ、および属性)の特定のコンテンツを検索したいと考えています。これはHtmlAgilityPackでどのように実現できますか? HtmlAgilityPackはxpath + regexを処理できますか、正規表現とHtmlAgilityPackを使用して検索する最良の方法は何ですか?

受け入れられた回答

Html Agility Packは、XPATHサポートのために基礎となる.NET XPATH実装を使用します。幸いにも.NETのXPATHは完全に拡張性があります(これほど素晴らしい技術にはMicrosoftがこれ以上投資しないのは残念ですが...)。

だから、私はこのhtmlがあると仮定しよう:

<div>hello</div>
<div>hallo</div>

以下は、ノードを 'h.llo'正規表現と比較するため、両方のノードを選択するサンプルコードです:

<div>hello</div>
<div>hallo</div>

これは、私が "regex-is-match"という新しいXPATH関数を定義した特別なXslt / XPathコンテキストを使用しているために機能します。 SelectNodesユーティリティーコードは次のとおりです。

<div>hello</div>
<div>hallo</div>

サポートコードは次のとおりです。

<div>hello</div>
<div>hallo</div>

regex関数は、最後にRegexIsMatchというクラスに実装されています。超複雑ではありません。注意すべき点は、任意のxpath「もの」を非常に便利な文字列に変換しようとするユーティリティ関数ConvertToStringです。

もちろん、このテクノロジでは、必要なXPATH関数を非常に小さなコードで定義することができます(これは大文字小文字の変換を行うために常に使用しています...)。


人気のある回答

直接引用

私は、HTMLはChomsky Type 2文法(文脈自由文法)であり、RegExはChomsky Type 3文法(正規文法)であるというのがこの欠陥です。タイプ2の文法は、タイプ3の文法(基本的にチョムスキーの階層を参照)よりも基本的に複雑であるため、この作業を行うことはできません。しかし、多くは試みます、いくつかは成功を主張し、他の人は間違いを見つけてあなたを完全に台無しにします。

HTML文書のいくつかの部分で正規表現を使用するのが理にかなっているかもしれません。 HtmlAgilityPackを使用してHTML文書のタグや構造体で正規表現を実行しようとすると、 HtmlAgilityPackで最終的には問題への普遍的な解決策を提供できません。





ライセンスを受けた: CC-BY-SA
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ