引言
之前写了这两篇,对OpenDRIVE文件的读写有了一点认识。
但我也会思考一个问题,如何检测我读入的文件是否符合OpenDRIVE的规范呢?
这天,我看到了LGSVL Simulator的源码,它可以实现OpenDRIVE1.4地图的读写。我好奇地看了看它是如何读写OpenDIRVE的:使用的果然是Deserialize
函数和Serialize
函数(可查看【C#】读写XML文件总结)!
但是它的OpenDRIVE类比我之前看到的要复杂很多,最上方的注释,解释了这个玄机:
//------------------------------------------------------------------------------
//<auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//</auto-generated>
//------------------------------------------------------------------------------
//
//This source code was auto-generated byMonoXSD
//
原来OpenDRIVE的类可以由xsd文件自动生成!这样就不用自己费尽心思去考虑类中到底要添加哪些元素和属性了~ 此外,还可以检测到读取的文件是否符合xchema规范、确保写到硬盘中的文件也符合规范,正确性的问题也解决了!
目前OpenDRIVE的官网给出了1.6,1.5,1.4的规范说明,而1.6和1.4并不兼容,所以我们的OpenDRIVE读写器必须同时兼容以上3个版本,这样的话我们就需要分别根据它们的xsd文件生成对应的类了~
什么是MonoXSD/xsd.exe
微软的.NET官方文档中介绍了XML架构定义工具(Xsd.exe)。它可以从XDR,XML和XSD文件或运行时程序集中的类生成XML架构或公共语言运行时的类。
XML架构定义工具(Xsd.exe)通常可以在以下路径中找到:
C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ {
version} \ bin \ NETFX {
version} Tools \
如何使用
微软的官方文档 How to: Use the XML Schema Definition Tool to Generate Classes and XML Schema Documents 中介绍了给工具的用法。
我举个例子:把OpenDRIVE V1.6的xsd文件转成对应的类:
-
导航到需要转换的xsd文件所在的目录
在地址栏中输入cmd,在此位置打开一个命令行工具
-
在
C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ {version} \ bin \ NETFX {version} Tools \
目录下找到xsd.exe
,并拷贝到xsd文件所在目录。
-
输入以下命令,即可生成.cs文件:
xsd /classes /language:CS opendrive_16_core.xsd