微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用C#XML反序列化来解析FCPXML文件

如何解决如何使用C#XML反序列化来解析FCPXML文件

我想使用C#解析FCPXML文件DTD is available。首先,我在Visual Studio 2017中打开了DTD,并使用菜单栏项XML->Create Schema将其导出为XSD。在这种情况下,上面的DTD版本缺少info-asc-cdl元素,因此您必须从version 1.1 of the DTD对其进行修补。

然后我跑了

"c:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/bin/NETFX 4.0 Tools/x64/xsd.exe" ..\..\FcpXml\xsd\fcpxml1p8.xsd /classes /outputdir:..\..\FcpXml /namespace:LibTimeline.FcpXml

...从构建目录开始。

当我尝试使用以下代码进行反序列化时:

  var serializer = new XmlSerializer(typeof(fcpxml));

  using (var reader = new StreamReader(path))
  {
    fcp = (fcpxml)serializer.Deserialize(reader);
  }

我得到了一个例外,InvalidOperationException: <fcpxml xmlns=''> was not expected.这很有意义,因为生成的XSD将targetNamespace命名为http://tempuri.org/fcpxml1p8

<xs:schema xmlns="http://tempuri.org/fcpxml1p8" elementFormDefault="qualified" targetNamespace="http://tempuri.org/fcpxml1p8" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="fcpxml">

但是,我正在解析的实际XML文件没有为根节点指定名称空间:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fcpxml>
<fcpxml version="1.8">
    <resources>
        <format width="1920" id="r0" frameDuration="1001/30000s" height="1080" name="FFVideoFormat1080p2997"/>

推荐的处理方式是什么?如果可能的话,我想继续使用C#XML反序列化。 DTD -> XSD -> C#流程非常好。由于输入文件是由第三方工具(Final Cut Pro,DaVinci,Premiere等)生成的,因此我无法真正更改磁盘上的输入文件。我想一旦将XML加载到内存中就可以对其进行编辑。

请注意,我尝试使用以下代码在C#中指定根节点:

  var xRoot = new XmlRootAttribute { ElementName = "fcpxml",IsNullable = false };
  var serializer = new XmlSerializer(typeof(fcpxml),xRoot);
  using (var reader = new StreamReader(path))
  {
    fcp = (fcpxml)serializer.Deserialize(reader);
  }

这允许我无例外地反序列化根节点(及其属性),但是没有一个子节点反序列化。我相信这是因为它们没有预期的名称空间。

解决方法

如果从生成的XSD文件的根元素中删除以下两个属性:

xmlns="http://tempuri.org/fcpxml1p8"
targetNamespace="http://tempuri.org/fcpxml1p8"

...并重新生成类,它将反序列化整个结构,并且您不必包括xRoot参数。

var serializer = new XmlSerializer(typeof(fcpxml));
using (var reader = new StreamReader(path))
{
    doc = (fcpxml)serializer.Deserialize(reader);
}

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。