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