[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了,难道有生之年系列吗?
下载APP请到下面的源代码页面
项目开源
[UWP小白日记-7]转换MVA学院的XML字幕为SRT (二)的更多相关文章
- [UWP小白日记-5]转换MVA学院的XML字幕为SRT
开源地址:第二版开源地址GIT 暂时用不了了,在最新的WIN10 10586.494系统上回闪退,正在酝酿第二版 O(∩_∩)O哈哈~ 新版已经完工:第二版 地方MVA上好多教程,但是微软的所有中国网 ...
- [UWP小白日记-9]页面跳转过度动画(二)
又打算动手写了 [UWP小白日记-6]页面跳转过度动画 上次写的,这次随着学习的进度使用新的玩法. 最近在搞GIT的学习,结果把好好的项目玩坏,都不知道当时是怎么想的拿在写的APP来玩GIT,害我重写 ...
- 小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0
Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测 ...
- 小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy
四层发现 四层发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行精确判断,其本质是利用四层协议的一些通信来识别主机ip是否存在. 四层发现的优点: 1.可路由且结 ...
- 小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping
三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议 ...
- 小白日记3:kali渗透测试之被动信息收集(二)-dig、whios、dnsenum、fierce
一.DIG linux下查询域名解析有两种选择,nslookup或者dig.Dig(Domain Information Groper)是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,M ...
- [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)
前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...
- [UWP小白日记-15]在UWP手机端实时限制Textbox的输入
说实话重来没想到验证输入是如此的苦逼的一件事情. 网上好多验证都是在输入完成后再验证,我的想法是在输入的时候就限制输入,这样我就不用再写代码来验证了 应为是手机端,所以不用判断其他非法字符,直 ...
- [UWP小白日记-8]一些零碎的东西
设置启动窗口大小 直接上代码了没什么好解释的了,既然能设置最小,那铁定就能设置最大 public MainPage() { //设定窗口启动显示大小 ApplicationView.Preferred ...
随机推荐
- mysql查询字段值为数字
原文:mysql查询字段值为数字 我想查询字段值为数字的sql如下:select * from tj_item_result where tj_value REGEXP '^[0-9]'
- 代码审查 (Google牛人谈Code Review)
代码审查 (Google牛人谈Code Review) 在上一篇博客里我暗示自己将不在为Google工作. 我还没有决定好去哪儿-有几个非常不错的工作机会让我选择.鉴于这段时间内我不受雇于任何公司,我 ...
- IP地址规划和设计方法
IP地址规划和设计方法 无类域间路由技术需要在提高 IP 地址利用率和减少主干路由器负荷两个方面取得平衡 网络地址转换 NAT 最主要的应用是专用网,虚拟专用网,以及 ISP 为拨号用户 提供的服务 ...
- ASP.NET MVC中Area的另一种用法
ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...
- bootstrap悬浮顶部或者底部
这是bootstrap提供的样式,只需要引入bootstrap.css即可. 需要使用的class样式: navbar navbar-inverse navbar-inner navbar-fixed ...
- enode框架
enode框架 2.0 step by step之整体架构介绍 前言 enode框架简介 enode架构图 command handler一次只处理一个command 让domain生活在in mem ...
- JAVA学习:多态
多态:可以理解为事物存在的多种体现形态. 人:男人,女人 动物:猫,狗. 猫 x = new 猫(); 动物 x = new 猫() 1,多态的体现 父类的引用指向了自己的子类对象. 父类的引 ...
- 笔试总结篇(一) : 广州X公司笔试
一.单选题: Ps : 当时由于去广州路上颠簸很困,导致刚做几分钟题目就睡了一觉.起来发现20分钟过去了.擦擦! 1. 假设磁盘文件foobar.txt 由 6个ASCII 码字符“foobar” 组 ...
- android通过程序收起通知栏
1. 添加权限 <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> 2. ...
- Solr与MongoDB集成,实时增量索引
Solr与MongoDB集成,实时增量索引 一. 概述 大量的数据存储在MongoDB上,需要快速搜索出目标内容,于是搭建Solr服务. 另外一点,用Solr索引数据后,可以把数据用在不同的项目当中, ...