我正在尝试在第三方的架构文件(它是 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 尝试一一解析它们
我下载了您的 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。
| 归档时间: |
|
| 查看次数: |
10846 次 |
| 最近记录: |