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

瞎扯淡

  上个版本,非常蠢用来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

时间: 2024-12-17 09:13:44

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

小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping

三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议,arp协议属于二层协议,它是基于广播的,所以不可路由.而ICMP协议是可以路由的,理论上可以使用icmp协议发现全球的ip,如果没有边界防火墙(禁止icmp的探测包)进行过滤的话,对目标主机进行扫描,则会收到相应的响应,从而进行捕捉[有边界防火墙的现象比较普遍],但是三层发现的扫描速度也较二层要慢

小白日记3:kali渗透测试之被动信息收集(二)-dig、whios、dnsenum、fierce

一.DIG linux下查询域名解析有两种选择,nslookup或者dig.Dig(Domain Information Groper)是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具. <span style="font-size:18px;">[email protected]:~# dig -h Usage: dig [@global-server] [domain] [q-type] [q-class] {q-opt} {glo

小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy

四层发现 四层发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行精确判断,其本质是利用四层协议的一些通信来识别主机ip是否存在. 四层发现的优点: 1.可路由且结果可靠: 2.不太可能被防火墙过滤,甚至可以发现所有端口都被过滤的主机.[一些比较严格的防火墙还是会过滤掉]   缺点:是基于状态过滤的防火墙可能过滤扫描:全端口(UDP+TCP十几万个端口)扫描的速度慢. 一.TCP探测[基于特征] tcp连接是通过三次握手建立通信过程. 1.未经请求的ACK[直

小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0

Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测试和漏洞攻击中,具有很大的优势 实验对象:crossfire[多人在线RPG游戏] 运行平台:Kali i686 虚拟机[32位,计算机CPU位数是指地址总线位数,64位系统的寻址空间为2^64,寻址过大,难以处理,为了简化本章操作,所以选用32位] 搭建实验环境 #linux中,游戏需安装带其ga

[UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Entity Framework Core(Entity Framework 7)下文将简称:EF 1.在UWP中使用EF需要更新Microsoft.NETCore.UniversalWindowsPlatform到大于“5.2.2”的版本. 2.直接在“程序包管理器控制台”输入命令来更新:Update-P

[UWP小白日记-3]记账项目-1

学了一段时间的UWP,来个项目试试手. 本来是想边做边学MVVMLight的结果感觉MVVM对于萌新来说太高难,以后再把这个项目改造成MVVMLight框架的项目. 下面进入正题. 中间那快空白打算放gridview,用来放标签.利用DataTemplate读取数据库里的标签表. 头部标题和底部标签没什么好说的,主要说下那个pivot的实现. 先来看看图,就知道有什么问题了,然后在解决这个问题. 鼠标点最左边尽然也能跳转页面,这什么鬼,改了他的默认Styel一样不行. 1 <Style x:Ke

[UWP小白日记-2]SQLite数据库DOME

数据库说简单点就是增删改查,但是对新手来说也是要爆肝的.作为一个新手爆肝无数次啊, 血的教训啊现在UWP的教程又少,说多了都是泪.留下来免得以后又爆肝.还有:一定要写注释!一定要写注释!一定要写注释! 重要的事情说三遍! 1.首先,准备工作: 1)引用: 获取途径:VS里的扩展和更新.NuGet等. 2)数据库模型: 1 internal class ACCOURT 2 { 3 public ACCOURT() { } //空构造函数 4 public ACCOURT(int ID,double

[UWP小白日记-15]在UWP手机端实时限制Textbox的输入

说实话重来没想到验证输入是如此的苦逼的一件事情. 网上好多验证都是在输入完成后再验证,我的想法是在输入的时候就限制输入,这样我就不用再写代码来验证了 应为是手机端,所以不用判断其他非法字符,直接把Textbox的属性InputScope设置为"Number"就是了,反正在目前版本的UWP中纯数字键盘还无法切换到其他的字符键盘去 下面的代码是一个金额文本框的验证,算是抛砖引玉吧.欢迎还有更好的方案指点! 直接上代码: /// <summary> /// 检查输入金额,当检测到

[UWP小白日记-3]记账项目-2

手机端: PC端: 待续……