ホームページ  >  記事  >  ウェブフロントエンド  >  HTML を XHTML に変換し、不要なタグと属性を削除します_html/css_WEB-ITnose

HTML を XHTML に変換し、不要なタグと属性を削除します_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:47:301668ブラウズ

はじめに

これは、HTML から有効な XHTML を生成するのに役立つ古典的なライブラリです。また、タグと属性のフィルタリングのサポートも提供します。どのタグと属性を出力に表示できるようにするか、その他のタグを除外するかを指定できます。このライブラリを使用して、Microsoft Word ドキュメントを HTML に変換するときに生成される肥大化した HTML をクリーンアップすることもできます。また、ブログ サイトに公開する前に HTML をクリーンアップする必要があります。そうしないと、WordPress、b2evolution などのブログ エンジンがそれを拒否します。

仕組み

これには、HtmlReader と HtmlWriter の 2 つのクラスがあります

HtmlReader は、Chris Clovett によって開発された有名な SgmlReader を拡張します。 HTML を読み取るときは、接頭辞付きのノードをすべてスキップします。その中で、 などの何百もの無駄なタグが除外されました。このようにして、読み取る HTML にはコア HTML タグのみが含まれます。

HtmlWriterは従来のXmlWriterを拡張したもので、XmlWriterはXMLを生成します。 XHTML は本質的には XML 形式の HTML です。


などのよく知られたタグはすべて、XHTML の終了タグではありません ( など)。 ;br/> と


XHTML は一般的な XML 形式であるため、XML パーサーを使用して XHTML ドキュメントを簡単に読み取ることができます。これにより、XPath 検索を適用する機会が提供されます。

HtmlReader

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();

}

}

ステータスを返す。

}

}

HtmlWriter

この種類は点麻​​烦です。通常の XML コード。HTML ファイルを手動で変更します。

WriteStartElement は、書き込み出力への許可されていないマークを回避するために使用されます。可変配置性
  • 以下の部分の構成HtmlWriterを変更することで可能です:

  • 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

    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" 、「ターゲット」、「ボーダー」、「ソース」 ,

    「整列」 、「幅」 、「高さ」 、「色」 、「サイズ」

    };

    }

    WriteStringメソッド

    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 );

    }

    }

    WriteStartElement: 应用标签过滤

    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();

    インターフェイス

    アプリケーションの例は、HTML ファイルを処理するためにすぐに使用できるツールです。この種類のアプリケーションは、HTML を Web サービスに配信する必要がある画像博客などで使用できます。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。