1

私は現在、XHTML ドキュメント操作も処理する必要があるデスクトップ アプリケーションを c# でコーディングしています。その目的のために、これまでのところ問題ないように思われたHtml Agility Packを使用しています。Html Agility Pack からの出力を注意深く確認したところ、コードが整形式の xhtml ではなくなっていることがわかりました。

自己終了タグ (スラッシュ) を削除し、他の独自のコード要素を上書きします...

例えば。入力 HTML コード:

<input autocapitalize="off" id="username" name="username" placeholder="Benutzername" type="text" value="$(username)" />

例えば。出力htmlコード

<input autocapitalize="off" id="username" name="username" placeholder="Benutzername" type="text" value="$(username)">

(末尾のスラッシュを削除しました...)

もう 1 つの例は、独自のコード要素 (Mikrotik ホットスポット デバイス用) の場合です。

例:入力 html コード

<form action="$(link-login-only)" method="post" name="login" $(if chap-id) onSubmit="return doLogin()"$(endif)>

、および部分は$(if chap-id)、Mikrotik デバイスから解釈されたカスタム コード フラグメントです。$(endif)$(link-login-only)

例えば。Html Agility Pack の後にHTML コードを出力します (これにより、使用できないコードに変換されます)。

<form action="$(link-login-only)" method="post" name="login" $(if="" chap-id)="" onsubmit="return doLogin()" $(endif)="">

適切な形式の XHTML を出力し、「カスタム コード」フラグメントを無視するように Html Agility Pack に「指示」する方法を誰かが考えていますか (これはおそらく Regex 経由ですか)?

前もって感謝します!:-)

4

3 に答える 3

3

最初の例では、HTML Agility Pack が実際にマークアップを修正しています。入力要素はvoid 要素です。内部にはコンテキストがないため、終了タグは必要ありません。

HTML Agility Pack は、カスタム コードに埋め込まれたマークアップではなく、有効な HTML マークアップを解析するために作成されています。最初の例では、カスタム マークアップは引用符で囲まれているため、問題にはなりません。2 番目の例では、変数は引用符の外にあります。

HTML Agility Pack は、それらを要素の通常の (ただし形式が正しくない) 属性として解析しようとします。それを修正する方法はありません。マークアップ内のカスタム コードのサポートが必要な場合は、マークアップを解析する別の方法を見つける必要があります。

于 2013-05-06T18:36:14.697 に答える
0

代替手段はCsQuery です。これは、少なくともここで得た単純なケースでは、値のない属性のように扱うという性質により、プリプロセッサ タグをそのままにします。つまり、HAP はsomeattribute、値のない属性を に変換するように見えますsomeattribute=""。CsQuery はこれを行いません。

ただし、@Justin Niessner がマークアップについて行った観察は、そこにあるテンプレート コードを解析するように特別に設計されていないパーサーに当てはまります。この 1 つの例が CsQuery を通過するからといって、他の形式が有効な属性名ではない、または有効でない場合でも少なくとも HTML5 パーサーに受け入れられるものにならないという保証はありません。

何かを HTML として操作する必要がある場合は、テンプレート化してから行います。テンプレートエンジンがそれを処理する前にそれを操作する必要がある場合、それはまだ HTML ではないため、キャッチ 22 になります。または、キーワードに有効な HTML マークアップを使用するテンプレート システムを使用することもできます (例: Knockout )。

于 2013-05-06T19:09:27.513 に答える