これは、HTML から有効な XHTML を生成するのに役立つ古典的なライブラリです。また、タグと属性のフィルタリングのサポートも提供します。どのタグと属性を出力に表示できるようにするか、その他のタグを除外するかを指定できます。このライブラリを使用して、Microsoft Word ドキュメントを HTML に変換するときに生成される肥大化した HTML をクリーンアップすることもできます。また、ブログ サイトに公開する前に HTML をクリーンアップする必要があります。そうしないと、WordPress、b2evolution などのブログ エンジンがそれを拒否します。
これには、HtmlReader と HtmlWriter の 2 つのクラスがあります
HtmlReader は、Chris Clovett によって開発された有名な SgmlReader を拡張します。 HTML を読み取るときは、接頭辞付きのノードをすべてスキップします。その中で、
HtmlWriterは従来のXmlWriterを拡張したもので、XmlWriterはXMLを生成します。 XHTML は本質的には XML 形式の HTML です。 、
、
HtmlReader は非常にシンプルで、以下が完全なクラスです:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
////// このクラスは、いくつかのノードをスキップします。
/// このトリックは一種の接頭辞です。ジョブ
//base.DocType = "HTML" ;
}
public HtmlReader(string content):base()
{
base.InputStream = new StringReader(content) ;
}
public override bool Read()
{
bool status = Base.Read();
if (ステータス)
{
if ( base.NodeType == XmlNodeType.Element )
{
// ノードを取得しました接頭語。 これは 1 つである必要があります
// これらの「」または他のもののうちの 1 つである必要があります。
// このノードを完全にスキップします。 プレフィックス
// ノードが少ないため、結果の XML
// 名前空間は必要ありません。
if ( base.Name.IndexOf( ':' ) > 0 )
base.Skip();
}
}
ステータスを返す。
}
}
この種類は点麻烦です。通常の XML コード。HTML ファイルを手動で変更します。
WriteStartElement は、書き込み出力への許可されていないマークを回避するために使用されます。可変配置性以下の部分の構成HtmlWriterを変更することで可能です:
2
4
5
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class HtmlWriter:XmlTextWriter
{
////// true に設定すると、タグと属性のフィルタリングを使用して出力をフィルタリングします
/// // スペース リデュース など
/// public bool FilterOutput = false;
////// true の場合、 1 つのインスタンスで 連続が減少します
///public bool ReduceConsecutiveSpace = true;
////// 出力に移動できるタグ名を小文字で設定します
///public string [] AllowedTags =
new string[] { "p" , "b" , "i" 、「u」、「em」、「big」、「small」、
「div」、「img」、「span」、「blockquote」、「code」、「pre」、「br」、「hr」 ,
「ul」 、「ol」 、「li」 、「del」 、「ins」 、「strong」 、「a」 、「font」 、「dd」 、「dt」 };
////// 許可されていないタグが見つかった場合は、このタグに置き換えられます。
/// 出力への影響が最も少ないタグを指定します
/// public string ReplacementTag = "dd";
////// 新しい行 rn は スペース に置き換えられます
/// スペースが節約され、
/// 出力 コンパクトになります
///public bool RemoveNew行 = true;
////// 許可される属性を指定します。
///その他の属性はすべて破棄されます
///public string [] AllowedAttributes = new string[]
{
"class" , "href" 、「ターゲット」、「ボーダー」、「ソース」 ,
「整列」 、「幅」 、「高さ」 、「色」 、「サイズ」
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//////
/// このメソッドをオーバーライドする理由は、出力を
/// 属性内のテキストとノード ele 内でエンコードしたくないためです。メンツ。 たとえば、すべての
/// は   in 出力に変換されます。 ただし、これは
/// HTML には適用されません。 HTML では、そのままにする必要があります。
//////public override void WriteString(string text)
{
// すべての非改行スペースを通常のスペースに変更します
text = text.Replace( " " , " " );
/// RSS フィードを読んだり、HTML を書いたりする場合、
/// この行は、CDATA タグを削除するのに役立ちます
text = text.Replace( "" , "" );
// 独自のエンコーディングを実行します。理由は
// WriteRaw を使用する予定ですが、これには使用できません
// 必要なエンコーディングを実行します
text = text.Replace( "<" , "<" );
テキスト = text.Replace( ">" , ">" );
text = text.Replace( "'" , "'" );
text = text.Replace( """ , "" e;" );
if ( this .FilterOutput )
{
text = text.Trim();
// 連続するスペースを置き換えたい
// 横幅を節約するために 1 つのスペースにします
if ( this .ReduceCons ecutiveSpace )
text = text.Replace( " " , " " );
if ( this .RemoveNewlines )
text = text.Replace(Environment.NewLine, " " );
base.WriteRaw( text );
}
else
{
Base.WriteRaw( text );
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public override void WriteStartElement(string prefix,
string localName, string ns)
{
if ( this .FilterOutput )
{
bool canWrite = false ;
string tagLocalName = localName.ToLower();
foreach( string name in this .AllowedTags )
{
if ( name == tagLocalName )
{
canWrite = true ;
休憩 ;
}
}
if ( !canWrite )
localName = "dd" ;
}
Base.WriteStartElement(prefix, localName, ns);
}
WriteAttributes メソッド: 应用プロパティ过滤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bool canWrite = false ;
string attributeLocalName = reader.LocalName.ToLower();
foreach( string name in this .AllowedAttributes )
{
if ( name == attributeLocalName )
{
canWrite = true ;
休憩 ;
}
}
// 許可されている場合、属性を書き込みます
if ( canWrite )
this .WriteStartAttribute(reader.Prefix,
attributeLocalName, reader.NamespaceURI);
while (reader.ReadAttributeValue())
{
if (reader.NodeType == XmlNodeType.EntityReference){
if ( canWrite ) this .W riteEntityRef(reader.Name);
続けます ;
}
if ( canWrite ) this .WriteString(reader.Value);
}
if ( canWrite ) this .WriteEndAttribute();
インターフェイス