将 XJC 与 xml.xsd 导入一起使用时出错:“无法读取架构文档 'xml.xsd'”

Ice*_*nte 5 java xml xsd jaxb

我正在尝试在第三方的架构文件(它是 Amazon.com 的产品 API)上运行 xjc。好吧,我遇到了麻烦,因为对于其中一个文件 default.xsd,xjc 正在执行以下导入(这是模式声明之后的第一个):

<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd" />
Run Code Online (Sandbox Code Playgroud)

我不是 XML 专家,但我认为 xml.xsd 是“核心”XML/XSD 库的一部分,默认情况下 XJC 会知道这个库的详细信息。但是当我运行任务时,我收到此错误:

[警告] schema_reference.4:无法读取架构文档“xml.xsd”,因为 1) 找不到该文档;2) 无法读取文件;3) 文档的根元素不是 。文件的第 9 行:/C:/temp/amazon/default.xsd

[错误] src-resolve:无法将名称“xml:lang”解析为 (n)“属性声明”组件。文件的第 119 行:/C:/temp/amazon/default.xsd

我尝试将 xml.xsd 文件从http://www.w3.org/2001/03/xml.xsd下载到包含这些架构文件的目录并再次运行该命令,但 xml.xsd 未验证:

[ERROR] schema_reference.4:无法读取架构文档“file:/C:/temp/amazon/xml.xsd”,因为 1) 找不到文档;2) 无法读取文件;3) 文档的根元素不是 。未知地点

我正要开始思考为什么这不会得到验证,但决定推迟,因为我认为我错过了一些非常简单或很小的东西。我需要手动包含 xml.xsd 导入还是我缺少其他东西?

我正在使用的架构的网址目前在这里:

http://g-ecx.images-amazon.com/images/G/01/mwsportal/doc/en_US/products/default.xsd

和这里

http://g-ecx.images-amazon.com/images/G/01/mwsportal/doc/en_US/products/ProductsAPI_Response.xsd

我只是在使用:

xjc dirname 一起或 xjc filename 尝试一一解析它们

Abe*_*bel 3

我下载了您的 XSD 文件来模拟该错误,事实上,当按原样下载时,它们会准确地给出您报告的错误。

目前还不清楚发生了什么。是的,XML 命名空间http://www.w3.org/XML/1998/namespace是特殊且保留的。您不必声明它存在,但该xml.xsd文件用于架构合规性,因此这些预定义类型也在 XSD 架构中定义,以便可以在使用架构时使用这些类型。

因此,我的第一个想法是需要将 XML 命名空间声明为xmlns:xml="http://www.w3.org/XML/1998/namespace"(通常不需要),以便 XJC 正常运行,但这并没有太大变化。

经过一番来回考虑后,我决定使用xjc选项运行-nv,该选项会关闭某些严格的验证规则。这次,我收到的错误更加清晰,并立即指出了原因,以及明显的解决方案:

[错误] 无法检索 'file:/D:/Projects/xyz/XMLSchema.dtd': java.io.FileNotFoundException: D:\Projects\xyz\XMLSchema.dtd (系统找不到指定的文件)第 2 行文件:/D:/Projects/xyz/xml.xsd

显然,XJC 尝试下载 DOCTYPE 声明引用的 DTD:

<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
Run Code Online (Sandbox Code Playgroud)

实际上,这不是 XJC,而是先于 XSD 验证的 XML 解析器。使用的 XML 解析器是验证解析器,这意味着它会尝试查找 DTD,如果找不到,则会中断。您收到的错误不是很有帮助,但正确,就像在 XML 术语中一样,指向 DTD 的 XML 文件不是有效的 XML 文件(但它可以是格式良好的 XML 文件和非验证 XML 处理器,而不是与 XSD 架构验证混淆,只会加载 XML)。

解决方案

但是,不需要 DTD 即可将 XML 视为正确。您可以下载 XMLSchma DTD,或者更简单的是,只需删除该行,无论是否有开关,处理都会成功-nv