3

次の HTML フラグメントを考えてみましょう (_は空白に使用されます)。

<head>
    ...
    <link ... ___/>
    <!-- ... -->
    ...
</head>

Html Agility Pack (HAP) を使用して、HTML ファイル/フラグメントを読み取り、リンクを削除しています。私がやりたいことは、LINK(および他のいくつかの)要素を見つけて、次のように空白に置き換えることです。

<head>
    ...
    ____________
    <!-- ... -->
    ...
</head>

解析部分はこれまでのところ機能しているようです。探しているノードを取得しています。ただし、HAP は HTML コンテンツを修正しようとしますが、私が行おうとしている変更を除いて、すべてをまったく同じにする必要があります。さらに、HAP には、以前に読み込まれたコンテンツを書き戻す際にかなりの数のバグがあるようです。そのため、HAP に入力を解析させてから、元の入力に戻ってコンテンツを置き換えるというアプローチを採用したいと考えています。したくない。

問題は、HtmlNode入力の長さのプロパティがないように見えることです。入力内でノードのコンテンツの読み取りが開始された場所を示してStreamPositionいるようですが、ノードを構築するために消費された文字数を示す長さプロパティが見つかりませんでした。

プロパティを使用してOuterHtmlみましたが、残念ながら、HAP はパーツLINKを削除して修正しようとします___/(LINK要素は閉じられていません)。このためOuterHtml.Length、間違った長さを返します。

HAP でこの情報を取得する方法はありますか?

4

3 に答える 3

3

HAP を再コンパイルせずに同じ結果を得たい場合は、リフレクションを使用してプライベート変数にアクセスします。

通常、プライベート変数にアクセスするためにリフレクションをお勧めしませんが、最近、アセンブリの再コンパイルされたバージョンを使用できなかったため、これとまったく同じ状況でリフレクションを使用しました。これを行うには、フィールド情報オブジェクトを保持する静的変数を作成します (使用するたびに再作成するのを避けるため)。

private static readonly FieldInfo HtmlNodeOuterLengthFieldInfo = typeof(HtmlNode).GetField("_outerlength", BindingFlags.NonPublic | BindingFlags.Instance);

次に、元の外側の HTML の実際の長さにアクセスしたいときはいつでも:

var match = htmlDocument.DocumentNode.SelectSingleNode("xpath");
var htmlLength = (int)HtmlNodeOuterLengthFieldInfo.GetValue(match);
于 2013-03-10T13:29:12.367 に答える
3

HtmlAgilityPack のコードを変更して、のプライベート_outerlengthフィールドを返す新しいプロパティを公開することになりましたHtmlNode

public virtual int OuterLength
{
    get
    {
        return ( _outerlength );
    }
}

これは今のところうまくいっているようです。

于 2012-10-24T03:36:00.903 に答える