• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    Visual Basic中如何處理HTML文檔和剪貼板

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 16次 | 進入軟件測試論壇討論

    領測軟件測試網   我的程序需要將HTML文檔放進剪貼板中,但我不知道要怎樣處理才能使其他程序也能使用它。我查看了一些關于HTML Clipboard Format (CF_HTML)的參考說明,但我還是找不到準確的定義。請問我該如何操作?

      解答:

      使用帶有Windows 剪貼板的CF_HTML Clipboard Format的確容易讓人搞胡涂,一部分是因為它不是clipboard format中自帶的剪貼板;它是一個注冊格式(registered format),所以不是一個常量,因為它的值會因為系統的不同而產生變化。你可以通過一個簡單的API調用 -- RegisterClipboardFormat來獲得一個注冊剪貼板格式的值。這個函數的首次調用會通過一個給定的字符串來執行,它返回一個范圍在C000-FFFF之間的唯一值。每一個在系統上處理的后續調用(subsequent call)會返回同樣的值。用于這種格式中的關鍵字符串就是“HTML Format”:


    Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA"
    (ByVal lpString As String) As Long
    Dim CF_HTML As Long
    Const RegHtml As String = "HTML Format"
    CF_HTML = RegisterClipboardFormat(RegHtml)

      你必須首先構建一個描述性的header,并在將HTML數據放入剪貼板之前先把它放到數據中。這個header會給其他程序提供描述版本信息、HTML起始數據的偏移量(offset),以及有關實際選擇范圍(actual selection)起始地方的信息。用戶可能會選擇的HTML文檔的一部分甚至只是一個元素(比如一個table中的幾行)作為一個選擇區域。頁面的其他部分,比如內聯樣式定義(inline style definitions)則可能會被要求進行完全渲染(render)。你不僅需要將最初所選擇的HTML區域放入剪貼板,而且還需要放入一個header,它看起來就像是這樣:


    Version:1.0
    StartHTML:000000258
    EndHTML:000001491
    StartFragment:000001172
    EndFragment:000001411

      應用程序通過StartFragment和EndFragment屬性來決定哪些數據需要粘貼,這些數據或許會(也可能不會)用剩下的HTML對所選擇的部分進行格式安排。你必須將HTML注釋放入數據中以便將來對所選部分進行識別。很明顯,你必須在構建最后的header之前完成它,否則偏移量會有變化。一個用于所選數據的opening/closing注釋標簽分別是“<!--StartFragment-->”和“<!--EndFragment-->”

      列表1. 在你構建一個用于HTML片斷的描述性header時這個程序(routine)會很有用。如果你放入整個HTML文檔,則StartFragment標簽會緊隨<body>標簽放入,而EndFragment標簽則會被放在</body>之前。如果你只是放入一段HTML而不是整個文檔,那么程序則只會放入<html>和<body>標簽。

    Public Function HtmlDescribed(ByVal Fragment As String) As String
     Dim Data As String
     Dim nPos As Long
     Const Description As String = "Version:1.0" & vbCrLf & "StartHTML:aaaaaaaaaa" & vbCrLf & _
    "EndHTML:bbbbbbbbbb" & vbCrLf & "StartFragment:cccccccccc" & vbCrLf & _
    "EndFragment:dddddddddd" & vbCrLf
     Const FragmentStart As String = "<!--StartFragment-->"
     Const FragmentEnd As String = "<!--EndFragment-->"
     Const Fmt As String = "0000000000"

     ' Add the starting and ending tags for the
     ' HTML fragment by looking for <body> tag.
     nPos = InStr(1, Fragment, "<body", vbTextCompare)
     Select Case nPos
      Case 0
       Fragment = "<html><body>" & vbCrLf & FragmentStart & Fragment
      Case Else
       nPos = InStr(nPos, Fragment, ">")
       If nPos > 0 And nPos < Len(Fragment) Then
        Fragment = Left$(Fragment, nPos) & FragmentStart & Mid$(Fragment, nPos + 1)
       End If
     End Select

     nPos = InStr(1, Fragment, "</body", vbTextCompare)
     Select Case nPos
      Case 0
       Fragment = Fragment & FragmentEnd & vbCrLf & "</body></html>"
      Case Else
       Fragment = Left$(Fragment, nPos - 1) & FragmentEnd & Mid$(Fragment, nPos)
     End Select

     ' Build the HTML given the description, the
     ' fragment, and the context. And, replace the
     ' offset placeholders in the description with
     ' values for the offsets of StartHMTL,
     ' EndHTML, StartFragment, and EndFragment.
     ' Offsets need to be zero-based when placed on
     ' clipboard, so subtract 1
     ' from each before injecting.
     Data = Description & Fragment
     Data = Replace(Data, "aaaaaaaaaa", Format$(Len(Description), Fmt))
     Data = Replace(Data, "bbbbbbbbbb", Format$(Len(Data), Fmt))
     nPos = InStr(Data, FragmentStart) - 1
     Data = Replace(Data, "cccccccccc", Format$(nPos + Len(FragmentStart), Fmt))
     nPos = InStr(Data, FragmentEnd) - 1
     Data = Replace(Data, "dddddddddd", Format$(nPos, Fmt))
     ' Return attributed string.
     HtmlDescribed = Data
    End Function

      在這里我無法對這個header的各個方面都進行詳細的介紹,所以我只能講解一些要點,你可以參考范例代碼以及進行更深入的了解。你必須記住幾個要點。Header中的偏移量是以零為基準的,因此你必須以此來調節你的字符串操作程序(string-manipulation routine )。而且,如果你不僅需要讀取而且需要編寫header,你則必須了解字符數(number of digits )(比如Inte.net Explorer [IE] 是9,Word是10)。

      最后,如果你只是將CF_HTML放入剪貼板,那么諸如Word和FrontPage等程序就處理不了了。你必須同時給剪貼板提供一個格式化的HTML的純文本編譯(plain-text rendition)以實現你所希望的結果。許多用來執行HTML-to-text轉換的工具或是macho可能都需要執行自帶的剖析器。但是Windows程序員是不需要對HTML進行手動解析的。你可以用OS來取代這個日常任務:


    Public Function Html2Text(ByVal Data As String) As String
     Dim obj As Object
     On Error Resume Next
     Set obj = CreateObject("htmlfile")
     obj.Open
     obj.Write Data
     Html2Text = obj.Body.InnerText
    End Function

      升級IE并不是解析HTML最快的方法,但卻是相當好用的方法

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>