亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

將HTML轉成XHTML并清除一些無用的標簽和屬性

2019-11-14 16:43:58
字體:
來源:轉載
供稿:網友

介紹

  這是一個能幫你從HTML生成有效XHTML的經典庫。它還提供對標簽以及屬性過濾的支持。你可以指定允許哪些標簽和屬性可在出現在輸出中,而其他的標簽過濾掉。你也可以使用這個庫清理Microsoft Word文檔轉化成HTML時生成的臃腫的HTML。你也在將HTML發布到博客網站前清理一下,否則像WordPRess、b2evolution等博客引擎會拒絕的。

 它是如何工作的

  里面有兩個類:HtmlReader和HtmlWriter

  HtmlReader拓展了著名的由Chris Clovett開發的SgmlReader。當它讀取HTML時,它跳過所有有前綴的節點。其中,所有像<o:p>、<o:Document>、<st1:personname>等上百的無用標簽被濾除了。這樣你讀取的HTML就剩下核心的HTML標簽了。

  HtmlWriter拓展了常規的xmlWriter,XmlWriter生成XML。XHTML本質上是XML格式的HTML。所有你熟悉使用的標簽——比如<img>、<br>和<hr>,都不是閉合的標簽——在XHTML中必需是空元素形式,像<img .. />、<br/>和<hr/>。由于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
////// This class skips all nodes which has some
/// kind of prefix. This trick does the job 
/// to clean up MS Word/Outlook HTML markups.
///public class HtmlReader : Sgml.SgmlReader
{
    public HtmlReader( TextReader reader ) : base( )
    {
        base.InputStream = reader;
        base.DocType = "HTML";
    }
    public HtmlReader( string content ) : base( )
    {
        base.InputStream = new StringReader( content );
        base.DocType = "HTML";
    }
    public override bool Read()
    {
        bool status = base.Read();
        if( status )
        {
            if( base.NodeType == XmlNodeType.Element )
            {
                // Got a node with prefix. This must be one
                // of those "" or something else.
                // Skip this node entirely. We want prefix
                // less nodes so that the resultant XML 
                // requires not namespace.
                if( base.Name.IndexOf(':') > 0 )
                    base.Skip();
            }
        }
        return status;
    }
}

 HtmlWriter

  這個類是有點麻煩。下面是使用技巧:

  • 重寫WriteString方法并避免使用常規的XML編碼。對HTML文件手動更改編碼。

  • 重寫WriteStartElementis以避免不被允許的標簽寫到輸出中。 

  • 重寫WriteAttributesis以避免不需求的屬性。

  讓我們分部分來看下整個類:

  可配置性

  你可以通過修改下面的部分配置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
public class HtmlWriter : XmlTextWriter
{
    ////// If set to true, it will filter the output
    /// by using tag and attribute filtering,
    /// space reduce etc
    ///public bool FilterOutput = false;
    ////// If true, it will reduce consecutive   with one instance
    ///public bool ReduceConsecutiveSpace = true;
    ////// Set the tag names in lower case which are allowed to go to output
    ///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"};
    ////// If any tag found which is not allowed, it is replaced by this tag.
    /// Specify a tag which has least impact on output
    ///public string ReplacementTag = "dd";
    ////// New lines /r/n are replaced with space 
    /// which saves space and makes the
    /// output compact
    ///public bool RemoveNewlines = true;
    ////// Specify which attributes are allowed. 
    /// Any other attribute will be discarded
    ///public string [] AllowedAttributes = new string[] 
    
        "class""href""target""border""src"
        "align""width""height""color""size" 
    };
}

  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
////// The reason why we are overriding
/// this method is, we do not want the output to be
/// encoded for texts inside attribute
/// and inside node elements. For example, all the  
/// gets converted to &nbsp in output. But this does not 
/// apply to HTML. In HTML, we need to have   as it is.
//////public override void WriteString(string text)
{
    // Change all non-breaking space to normal space
    text = text.Replace( " "" " );
    /// When you are reading rss feed and writing Html, 
    /// this line helps remove those CDATA tags
    text = text.Replace("""");
 
    // Do some encoding of our own because
    // we are going to use WriteRaw which won't
    // do any of the necessary encoding
    text = text.Replace( "<""<" );
    text = text.Replace( ">"">" );
    text = text.Replace( "'""&apos;" );
    text = text.Replace( "/""""e;" );
 
    ifthis.FilterOutput )
    {
        text = text.Trim();
 
        // We want to replace consecutive spaces
        // to one space in order to save horizontal width
        ifthis.ReduceConsecutiveSpace ) 
            text = text.Replace("   "" ");
        ifthis.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)
{
    ifthis.FilterOutput ) 
    {
        bool canWrite = false;
        string tagLocalName = localName.ToLower();
        foreach( string name in this.AllowedTags )
        {
            if( name == tagLocalName )
            {
                canWrite = true;
                break;
            }
        }
        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;
        break;
    }
}
// If allowed, write the attribute
if( canWrite ) 
    this.WriteStartAttribute(reader.Prefix, 
    attributeLocalName, reader.NamespaceURI);
while (reader.ReadAttributeValue())
{
    if (reader.NodeType == XmlNodeType.EntityReference)
    {
        if( canWrite ) this.WriteEntityRef(reader.Name);
        continue;
    }
    if( canWrite )this.WriteString(reader.Value);
}
if( canWrite ) this.WriteEndAttribute();

 結論

  示例應用是一個你可以立即用來清理HTML文件的實用工具。你可以將這個類應用在像博客等需要發布一些HTML到Web服務的工具中。

  原文地址:http://www.codeproject.com/Articles/10792/Convert-HTML-to-XHTML-and-Clean-Unnecessary-Tags-a


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品自在线视频| 亚洲午夜色婷婷在线| 一区国产精品视频| 国产在线精品成人一区二区三区| 亚洲三级免费看| 美女啪啪无遮挡免费久久网站| 在线观看国产成人av片| 国产精品专区一| 日韩av高清不卡| 亚洲理论电影网| 亚洲欧美中文字幕在线一区| 欧美性猛交xxxx黑人猛交| 亚洲精品成人久久久| 精品国产鲁一鲁一区二区张丽| 日韩中文在线不卡| 日韩欧美中文在线| 亚洲日本成人女熟在线观看| 国产精品久久久久影院日本| 色噜噜国产精品视频一区二区| 日韩精品视频在线观看网址| 亚洲夜晚福利在线观看| 成人黄色免费看| 欧美激情亚洲一区| 亚洲aa中文字幕| 91av视频在线| 日韩精品亚洲精品| 亚洲欧美日韩久久久久久| 久久久最新网址| 国产视频精品一区二区三区| 亚洲精品av在线播放| 粗暴蹂躏中文一区二区三区| 久久久久久亚洲精品不卡| 91高清免费在线观看| 国产欧美日韩综合精品| 国产综合在线看| 亚洲护士老师的毛茸茸最新章节| 中文精品99久久国产香蕉| 久久中国妇女中文字幕| 欧美成人免费视频| 欧美另类极品videosbest最新版本| 欧美视频中文字幕在线| 亚洲第一黄色网| 亚洲女人天堂成人av在线| 亚洲精品久久在线| 亚洲国产精品va在线观看黑人| 国产精品久久久久高潮| 美女精品视频一区| 日韩精品在线免费观看| 国产999精品| 尤物yw午夜国产精品视频| 欧美精品一区二区三区国产精品| 亚洲一区二区久久| 日韩中文字幕av| 日韩av在线电影网| 日韩在线欧美在线| 91tv亚洲精品香蕉国产一区7ujn| 日韩人在线观看| 日韩免费看的电影电视剧大全| 日韩欧美中文字幕在线观看| 欧美日韩视频免费播放| 欧美性极品xxxx娇小| 国内精品小视频在线观看| 亚洲无线码在线一区观看| 日韩一级裸体免费视频| 久久久久久有精品国产| 久久精品91久久久久久再现| 色av吧综合网| 米奇精品一区二区三区在线观看| 国产精品爱啪在线线免费观看| www.欧美精品一二三区| 亚洲欧美日韩视频一区| 在线播放精品一区二区三区| 精品少妇一区二区30p| 亚洲一区二区免费| 亚洲女人天堂成人av在线| 亚洲国产欧美在线成人app| 中文字幕精品在线| 久久亚洲精品一区二区| 日韩欧美国产黄色| 欧美日本中文字幕| 欧美国产日韩中文字幕在线| 国产精品久久久久久av| 91在线精品播放| 国产精品久久久久久久美男| 精品久久久久久久中文字幕| 日韩在线视频观看正片免费网站| 中文字幕日韩免费视频| 亚洲免费电影一区| 亚洲男人的天堂在线| 日韩在线视频线视频免费网站| 中文字幕亚洲一区| 亚洲国产小视频| 色婷婷久久一区二区| 亚洲综合社区网| www.久久久久| 欧美另类在线观看| 欧洲永久精品大片ww免费漫画| 久久久国产成人精品| 精品国产美女在线| 最好看的2019的中文字幕视频| 亚洲精品98久久久久久中文字幕| 亚洲在线视频观看| 久久九九国产精品怡红院| 国产精品夫妻激情| 国产成人精品综合久久久| 亚洲精品美女在线观看播放| xxx成人少妇69| 色老头一区二区三区在线观看| 欧美与黑人午夜性猛交久久久| 久久精品欧美视频| 日韩成人xxxx| 欧美日韩一区二区在线| 亚洲国产一区二区三区在线观看| 亚洲另类图片色| 欧美天天综合色影久久精品| 91最新国产视频| 97成人精品视频在线观看| 欧美裸体xxxxx| 日韩亚洲一区二区| 欧美在线视频播放| 精品五月天久久| 久久久久久九九九| 亚洲色图18p| 日韩av中文字幕在线免费观看| 久久精品成人欧美大片| 91网站在线看| 黑人精品xxx一区一二区| 亚洲人av在线影院| 宅男66日本亚洲欧美视频| 国产成人+综合亚洲+天堂| 国产日韩中文字幕在线| 国产视频在线观看一区二区| 国产精品视频男人的天堂| 97久久精品人搡人人玩| 欧美最顶级的aⅴ艳星| 中文字幕av一区| 欧美肥臀大乳一区二区免费视频| 亚洲91精品在线| 中文欧美日本在线资源| 日韩欧美在线视频免费观看| 中文字幕无线精品亚洲乱码一区| 成人久久18免费网站图片| 中文字幕日韩欧美在线| 欧美最猛性xxxx| 久久久久久国产精品三级玉女聊斋| 少妇激情综合网| 久久久亚洲影院| 欧美在线视频免费观看| 欧美性理论片在线观看片免费| 久久免费福利视频| 国产极品精品在线观看| 亚洲片国产一区一级在线观看| 96pao国产成视频永久免费| 亚洲电影免费观看高清完整版在线| 亚洲91精品在线观看| 51午夜精品视频| 国产欧美日韩精品专区| 992tv成人免费影院| 中文字幕最新精品| 国产日本欧美视频| 国产成人97精品免费看片| 中文字幕九色91在线| 亚洲人在线视频| 亚洲成色777777女色窝|