Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析XML以将时间文本标记转换为WebVTT_C#_Asp.net_Porting_Ttml_Webvtt - Fatal编程技术网

C# 解析XML以将时间文本标记转换为WebVTT

C# 解析XML以将时间文本标记转换为WebVTT,c#,asp.net,porting,ttml,webvtt,C#,Asp.net,Porting,Ttml,Webvtt,我正在开发一个web应用程序,它可以以时间文本标记(TTML)或其他格式接收字幕文件。如果文件是定时文本,我想将其转换为WebVTT。这基本上不是一个问题,我遇到的一个问题是,如果TTML将HTML作为文本内容的一部分,那么HTML标记就会被删除 例如: <p begin="00:00:08.18" dur="00:00:03.86">(Music<br />playing)</p> 我使用的代码是: private const string TIME_FO

我正在开发一个web应用程序,它可以以时间文本标记(TTML)或其他格式接收字幕文件。如果文件是定时文本,我想将其转换为WebVTT。这基本上不是一个问题,我遇到的一个问题是,如果TTML将HTML作为文本内容的一部分,那么HTML标记就会被删除

例如:

<p begin="00:00:08.18" dur="00:00:03.86">(Music<br />playing)</p>
我使用的代码是:

private const string TIME_FORMAT = "hh\\:mm\\:ss\\.fff";
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(fileLocation);
XDocument xdoc = xmldoc.ToXDocument();
var ns = (from x in xdoc.Root.DescendantsAndSelf()
          select x.Name.Namespace).First();

List<TTMLElement> elements =
(
     from item in xdoc.Descendants(ns + "body").Descendants(ns + "div").Descendants(ns + "p")
     select new TTMLElement
     {
          text = item.Value,
          startTime = TimeSpan.Parse(item.Attribute("begin").Value),
          duration = TimeSpan.Parse(item.Attribute("dur").Value),
     }
).ToList<TTMLElement>();

StringBuilder sb = new StringBuilder();
sb.AppendLine("WEBVTT");
sb.AppendLine();

for (int i = 0; i < elements.Count; i++)
{
     sb.AppendLine(i.ToString());
     sb.AppendLine(elements[i].startTime.ToString(TIME_FORMAT) + " --> " + elements[i].startTime.Add(elements[i].duration).ToString(TIME_FORMAT));
     sb.AppendLine(elements[i].text);
     sb.AppendLine();
}
private const string TIME\u FORMAT=“hh\\:mm\\:ss\\.fff”;
XmlDocument xmldoc=新的XmlDocument();
Load(fileLocation);
XDocument xdoc=xmldoc.ToXDocument();
var ns=(从xdoc.Root.genderantsandself()中的x开始)
选择x.Name.Namespace).First();
列表元素=
(
源于xdoc.子体(ns+“body”).子体(ns+“div”).子体(ns+“p”)中的项
选择新的TTMLElement
{
text=项目值,
startTime=TimeSpan.Parse(item.Attribute(“begin”).Value),
duration=TimeSpan.Parse(item.Attribute(“dur”).Value),
}
).ToList();
StringBuilder sb=新的StringBuilder();
sb.附录(“WEBVTT”);
(某人);
for(int i=0;i”+elements[i].startTime.Add(elements[i].duration.ToString(TIME_格式));
sb.AppendLine(元素[i].文本);
(某人);
}

如果您对我遗漏的内容有任何想法,或者是否有更好的方法,或者即使已经有了将时间文本转换为WebVTT的解决方案,我们都将不胜感激。谢谢。

Microsoft有一个工具可以生成两种格式:

此演示允许您创建简单的视频标题文件。首先以浏览器可以播放的格式加载视频。然后交替播放和暂停视频,为每个片段输入标题

如果为视频保存了WebVTT或TTML标题文件,则可以加载、编辑现有片段的文本或附加新片段


如果你想以编程的方式来做这件事,对的回答可能会有所帮助。

我终于回到了这个项目,我也找到了解决问题的方法

本节第一节:

from item in xdoc.Descendants(ns + "body").Descendants(ns + "div").Descendants(ns + "p")
    select new TTMLElement
    {
        text = item,
        startTime = TimeSpan.Parse(item.Attribute("begin").Value),
        endTime = item.Attribute("dur") != null ?
          TimeSpan.Parse(item.Attribute("begin").Value).Add(TimeSpan.Parse(item.Attribute("dur").Value)) :
          TimeSpan.Parse(item.Attribute("end").Value)
   }
项的类型为XElement,因此可以从中创建XmlReader对象,从而生成以下函数:

private static string ReadInnerXML(XElement parent)
{
    var reader = parent.CreateReader();
    reader.MoveToContent();
    var innerText = reader.ReadInnerXml();
    return innerText;
}
为了删除节点内的html,我修改了函数,如下所示:

private static string ReadInnerXML(XElement parent)
{
    var reader = parent.CreateReader();
    reader.MoveToContent();
    var innerText = reader.ReadInnerXml();
    innerText = Regex.Replace(innerText, "<.+?>", " ");
    return innerText;
}
from item in xdoc.Descendants(ns + "body").Descendants(ns + "div").Descendants(ns + "p")
    select new TTMLElement
    {
        text = ReadInnerXML(item),
        startTime = TimeSpan.Parse(item.Attribute("begin").Value),
        endTime = item.Attribute("dur") != null ?
          TimeSpan.Parse(item.Attribute("begin").Value).Add(TimeSpan.Parse(item.Attribute("dur").Value)) :
          TimeSpan.Parse(item.Attribute("end").Value)
   }

我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。谢谢你,我甚至没有想到这一点。
from item in xdoc.Descendants(ns + "body").Descendants(ns + "div").Descendants(ns + "p")
    select new TTMLElement
    {
        text = ReadInnerXML(item),
        startTime = TimeSpan.Parse(item.Attribute("begin").Value),
        endTime = item.Attribute("dur") != null ?
          TimeSpan.Parse(item.Attribute("begin").Value).Add(TimeSpan.Parse(item.Attribute("dur").Value)) :
          TimeSpan.Parse(item.Attribute("end").Value)
   }