使用xsd工具生成ONVIF XSD对应类时遭遇报错求助
老兄,我太懂你这个坑了!之前我第一次用xsd /c onvif.xsd的时候,也被一堆报错和警告搞得头大,核心问题就是ONVIF的XSD根本不是单一文件能搞定的,它依赖一大堆外部Schema文件。下面是我踩坑后总结的解决步骤:
1. 先把完整的Schema包下载全
别只单独下onvif.xsd!ONVIF官网提供了对应版本的完整Schema压缩包(比如你用的ver10版本,就找包含所有相关xsd的压缩包),下载后解压到你的C:...\myFolder目录里。这样所有依赖的文件(比如OASIS的WS-Addressing、WS-Policy这些xsd)都在同一个文件夹了,xsd.exe才能找到它们。
2. 把xsd里的绝对引用改成相对路径
有些xsd文件里的依赖引用是写的绝对URL(比如http://docs.oasis-open.org/wsaddr/2004/08/wsaddr.xsd),xsd.exe会傻呵呵地去网上下载,大概率会失败。你可以用文本编辑器批量替换这些引用,改成相对路径(比如直接写成wsaddr.xsd),前提是这个文件已经在你的本地文件夹里了。
3. 用正确的命令执行xsd.exe
当所有文件都准备好后,在VS2017开发者命令提示符里进入目标目录,执行这条命令:
xsd /c /n:YourCustomNamespace *.xsd
/c:告诉xsd.exe要生成C#类/n:YourCustomNamespace:替换成你自己想要的命名空间(比如Onvif.DeviceManagement),避免类名冲突*.xsd:一次性处理文件夹里所有xsd文件,让xsd.exe自动处理依赖关系,不用你手动一个个加
4. 处理剩余的小问题
如果还有警告(比如重复类型定义),可以加个/order参数强制保留元素顺序;要是碰到xsd.exe不支持的复杂约束,只要不影响核心功能,直接忽略警告就行。实在不行,就根据报错信息里的缺失项,单独去对应的官网下载缺失的xsd文件补到文件夹里。
举个我自己的例子:当时我把ver10的所有xsd都下载到本地,替换完引用后执行:
xsd /c /n:Onvif.Ver10 *.xsd
生成的类文件直接就能编译通过,后续调用ONVIF接口也没出过问题。
内容的提问来源于stack exchange,提问作者LoukMouk

