wp加載本地HTML(附帶圖片,CSS,JS)

wp加載本地HTML(附帶圖片,CSS,JS)css

Windows Phone:Load Local HTML with Img,Css,Jshtml

by 唐小崇web

http://www.cnblogs.com/tangchong數組

WindowsPhone中,使用WebBrower控件能夠加載HTML文件。其中包括:安全

一、本地以加載html文件流的形式加載HTML內容: webBrowser1.NavigatetoSting("<html>HTML內容.....</html>");網絡

二、本地加載中靜態HTML頁面:webBrowser1.Navigate(new Uri("xxx.htm",UriKind.Relative));函數

三、加載網絡上的Web頁面:webBrowser1.Navigate(new Uri("http://www.cnblogs.com",UriKind.Absolute));ui

在加載本地HTML時,this

若使用方法1,能夠成功讀入HTML並顯示,但並不會加載其帶有的圖片,js文件,css文件。spa

若對具備圖片的直接html使用方法2,因爲沒有載入圖片,js文件,css文件,會出現您訪問的頁面遇到問題提示。

那怎麼加載呢?本博文提供一個解決方案,以百度百科的某一網頁爲例。

思路是:將HTML頁面和其帶有的資源文件,按照HTML設定的src相對路徑,存放到wp的獨立存儲空間中。這樣在加載獨立存儲中的HTML時,HTML指定的資源src連接都有效。這樣經過方法2,圖片,js,css都能正常被指引了。

 

下面咱們看具體例子:

首先,咱們ctrl+S把示例網頁下載下來,獲得一個html文件,一個資源文件的文件夾。把它們放入項目中。

第一步:咱們要作的是獲取項目中HTML全部資源文件的文件路徑(保存進獨立存儲時必需)

對於wp8而言,很是簡單:

 

//讀取Assets/build/歷史頻道_百度百科_files文件夾下的全部文件。以放入獨立存儲。(只支持wp8)         
 string[] files = System.IO.Directory.GetFiles("Assets/build/歷史頻道_百度百科_files", "*.*");

 

可是,對於wp7因爲安全設定緣由,不支持GetFiles,而且沒有提供GetFiles的替代方法EnumerateFiles。本人想到的替代是:從HTML裏讀取那些資源的路徑信息,再整合一下。

 

從HTML裏讀數據,用到了一個經常使用的第三方庫。HtmlAgilityPack(可經過NuGet加載引用),它能夠很好的解析HTML各個標籤數據。

①把HTML數據讀入。

        var reader = new StreamReader(TitleContainer.OpenStream("Assets/build/baidu.htm"));
        htmlDocument.LoadHtml(reader.ReadToEnd());

②從HTML中讀出想要的數據,下面是我寫的功能函數:

        /// <summary>
        /// 從指定的HTML的標籤裏讀取指定類型的全部文件的完整路徑,存入filePaths數組中。該文件的類型由suffixName參數指定。
        /// </summary>
        /// <param name="tagName">指定標籤名</param>
        /// <param name="suffixName">指定文件的後綴名</param>
        private void ReadFilePathbyTagName(string tagName, string suffixName)
        {
            var keyNodes = htmlDocument.DocumentNode.SelectNodes(tagName);
            foreach (HtmlNode keyNode in keyNodes)
            {
                for (int i = 0; i < keyNode.Attributes.Count; i++ )
                {
                    if (keyNode.Attributes[i].Value.Contains(suffixName))
                        filePaths.Add("Assets/build/歷史頻道_百度百科_files\\" + keyNode.Attributes[i].Value.Split('/').Last());
                }

            }
        }

③在本例中,指定從img標籤裏讀取.jpg文件,script標籤中讀取.js文件,link文件中讀取.css文件便可得到想要的文件。再把html文件和表示logo的png文件的路徑也保存在filePaths數組中,就完成的第一步的任務了。

            ReadFilePathbyTagName("//link",".css");
            ReadFilePathbyTagName("//script", ".js");
            ReadFilePathbyTagName("//img", ".jpg");
            filePaths.Add("Assets/build/歷史頻道_百度百科_files\\logo-baike.png");
            filePaths.Add("Assets/build\\baidu.htm");

第二步即爲存入獨立存儲了。經過filePaths數組中存放的地址,讀入資源。再根據每一個資源中的路徑,建立獨立存儲裏文件路徑,最後把文件存入。

            var storage = IsolatedStorageFile.GetUserStoreForApplication();         
            string folderPath;
            foreach (string file in filePaths)
            {
                using (Stream stream = Application.GetResourceStream(new Uri(file, UriKind.Relative)).Stream)
                {
                    folderPath = file.Split('\\')[0];

                    if (!storage.DirectoryExists(folderPath))
                    {
                        storage.CreateDirectory(folderPath);
                    }

                    MemoryStream temStream = new MemoryStream();
                    stream.CopyTo(temStream);

                    lock (this)
                    {
                        string fullPath = file;
                        using (var fileStream = storage.OpenFile(fullPath, FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            temStream.Position = 0;
                            temStream.CopyTo(fileStream);
                        }
                    }
                }
            }

第二部完成,則經過代碼2載入獨立存儲裏的HTML文件。便可以實現將HTML文件完整的載入了。

下面是對比圖:

相關文章
相關標籤/搜索