瞎扯淡
上個版本,非常蠢用來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請到下面的源代碼頁面
項目開源
