码迷,mamicode.com
首页 > 其他好文 > 详细

[UWP小白日记-7]转换MVA学院的XML字幕为SRT (二)

时间:2016-07-31 20:46:49      阅读:606      评论:0      收藏:0      [点我收藏+]

标签:

瞎扯淡

  上个版本,非常蠢用来N多的循环导致非常卡性能烂得不行,这次使用XmlDocument类来读取XML字幕

其实根本不用各种扒XML字幕,好吧我这是学习使用XmlDocument类,嗯就是这个样子的。(⊙﹏⊙)b

技术分享

正文

  其实这个小程序,关键就是读取文件的时候要正确的转码,应为系统TXT文本默认使用的是ANIS编码,而XmlDocument使用的是UTF8。

不转码妥妥的乱码。

    先来看下成品,最后我会打包为APP供大家使用的。(GIF录制工具ScreenToGif,开源并且使用的是WPF开发,有兴趣的可以研究下下的)

技术分享

拖拽代码

这个没什么好说的很简单,TIPS:Drop事件是最后唯一能拿到拖拽数据的机会了。

 private void ListView_DragOver(object sender, DragEventArgs e)
        {
            e.AcceptedOperation = DataPackageOperation.Copy;
            e.DragUIOverride.Caption = "可以接受TXT和XML格式的MVA字幕文件";
            e.DragUIOverride.IsCaptionVisible = true;
            e.DragUIOverride.IsContentVisible = true;
            e.DragUIOverride.IsGlyphVisible = true;
        }

 

 List<string> pathList = new List<string>();//路径集合
        StorageFolder newStorF = ApplicationData.Current.LocalCacheFolder;//把文件复制到零时文件
        StorageFile newSfile;
        private async void ListView_Drop(object sender, DragEventArgs e)
        {
            if (e.DataView.Contains(StandardDataFormats.StorageItems))
            {
                var def = e.GetDeferral();
                var items = await e.DataView.GetStorageItemsAsync();


                if (items.Count > 0)
                {
                    foreach (var item in items)
                    {
                        sfile = item as StorageFile;
                        if (sfile.FileType == ".txt" | sfile.FileType == ".xml")
                        {
                            var changeNewSfilePaht = Path.ChangeExtension(sfile.Path, ".xml");
                            newSfile = await sfile.CopyAsync(newStorF, Path.GetFileName(changeNewSfilePaht), NameCollisionOption.ReplaceExisting);

                            listItems.Add(new Item { ID = listItems.Count + 1, fileName = newSfile.Name,statIcon=0 });
                            pathList.Add(newSfile.Path);

                        }
                    }
                }
             
                #endregion
                def.Complete();
            }
        }

转码输出

UWP撸掉了Encoding.Default。又没有内置GB2312的Encoding,只能自己注册一个GB2312了,其他编码类似。

 

    #region 注册GB2312
            EncodingProvider provider = CodePagesEncodingProvider.Instance;
            Encoding.RegisterProvider(provider);
            Encoding gb2312 = Encoding.GetEncoding("gb2312");
       #endregion

 

  

 

 

/// <summary>
        /// XML转SRT,且合并为一个格式化为SRT的list
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        private async void XMLtoSRT(string path)
        {
            

            List<String> beginAttribute = new List<String>();//开始时间
            List<String> endAttribute = new List<String>();//结束时间
            List<String> text = new List<string>();//节点文本类容
            List<string> sumStringList = new List<string>(); //最终格式完毕的字符列表

            
            #region 注册GB2312
            EncodingProvider provider = CodePagesEncodingProvider.Instance;
            Encoding.RegisterProvider(provider);
            Encoding gb2312 = Encoding.GetEncoding("gb2312");
            #endregion

            var content = File.ReadAllText(path, gb2312);

            byte[] tempG = gb2312.GetBytes(content);
            byte[] utf8 = Encoding.Convert(gb2312, Encoding.UTF8, tempG);
            string utf8str = Encoding.UTF8.GetString(utf8);


            XmlDocument document = new XmlDocument();
            document.LoadXml(utf8str);
            var templist = document.GetElementsByTagName("p");
            foreach (XmlNode p in templist)
            {
                beginAttribute.Add(p.Attributes["begin"].Value);
                endAttribute.Add(p.Attributes["end"].Value);
                text.Add(p.InnerText.Trim());
            }


            //输出
            var tempPath = Path.ChangeExtension(path, ".SRT");
            StorageFile newsfile3 = await storageFolder.CreateFileAsync(Path.GetFileName(tempPath), CreationCollisionOption.GenerateUniqueName);
            
            
            //还可以添加设置字体大小、颜色、字体等功能

            using (var stream1 = await newsfile3.OpenStreamForWriteAsync())
            {
                StreamWriter sw = new StreamWriter(stream1, Encoding.UTF8);
                for (int i = 0; i < beginAttribute.Count; i++)
                {
                    sw.Write(i + 1 + "\r\n" + beginAttribute[i] + "-->" + endAttribute[i] + "\r\n" + text[i] + "\r\n" + "\r\n");
                }
                sw.Dispose();
            }
        }

 虽然StreamWriter被各位小伙伴都玩坏了,蛋还是要提醒就是最后要调用:Dispose()方法施放魔鬼。

最后吐槽

  不得不吐槽,直接拖文件夹到VS里只有文件夹没有里面的类容,可见资产设置个图片打个包都各种报错,这尼玛都UPDATA3了,难道有生之年系列吗?

技术分享

下载

 
https://yunpan.cn/c6uJvZvDZVC2W     访问密码 f65d

项目开源

GIT

[UWP小白日记-7]转换MVA学院的XML字幕为SRT (二)

标签:

原文地址:http://www.cnblogs.com/Enious/p/5723723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!