代码之家  ›  专栏  ›  技术社区  ›  watkipet

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

  •  0
  • watkipet  · 技术社区  · 4 年前

    DTD is available . 首先,我在visualstudio2017中打开了DTD,并使用菜单栏项将其导出为XSD XML->Create Schema 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 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);
      }
    

    0 回复  |  直到 4 年前
        1
  •  2
  •   madreflection    4 年前

    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