使用带有 xml.xsd 导入的 XJC 时出错:"Failed to read schema document 'xml.xsd'"
Error using XJC with xml.xsd import: "Failed to read schema document 'xml.xsd'"
我正在尝试 运行 xjc 第三方模式文件(它是 Amazon.com 的产品 API)。好吧,我 运行 遇到了麻烦,因为其中一个文件,default.xsd,xjc 在下面的导入中很无聊(它是模式声明之后的第一个导入):
<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd" />
我不是 XML 方面的专家,但我认为 xml.xsd 是 "core" XML/XSD 库的一部分,XJC 会知道这方面的详细信息默认情况下的库。但是当我 运行 任务时,我得到这个错误:
[WARNING] schema_reference.4: Failed to read schema document
'xml.xsd', because 1) could not find the document; 2) the document
could not be read; 3) the root element of the document is not
. line 9 of file:/C:/temp/amazon/default.xsd
[ERROR] src-resolve: Cannot resolve the name 'xml:lang' to a(n)
'attribute declaration' component. line 119 of
file:/C:/temp/amazon/default.xsd
我尝试将 xml.xsd 文件从 http://www.w3.org/2001/03/xml.xsd 下载到包含这些架构文件的目录并再次 运行 命令,但 xml.xsd 未验证:
[ERROR] schema_reference.4: Failed to read schema document
'file:/C:/temp/amazon/xml.xsd', because 1) could not find the
document; 2) the document could not be read; 3) the root element of
the document is not . unknown location
我正要开始探究为什么这不会被验证,但决定推迟,因为我认为我遗漏了一些非常简单或小的东西。我需要手动包含 xml.xsd 导入还是我遗漏了其他东西?
我正在使用的模式的 url 当前在这里:
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 目录名
一起或
xjc 文件名
尝试逐一解析它们
我下载了您的 XSD 文件来模仿错误,事实上,当按原样下载时,它们给出的正是您报告的错误。
目前还不清楚发生了什么。是的,XML 命名空间 http://www.w3.org/XML/1998/namespace
是特殊的和保留的。您不必声明它就存在,但是 xml.xsd
文件用于 Schema compliance,因此这些预定义类型也在 XSD Schema 中定义,因此类型可以用于使用模式。
所以我的第一个想法是需要将 XML 命名空间声明为 xmlns:xml="http://www.w3.org/XML/1998/namespace"
(通常不需要)XJC 才能正常运行,但这并没有太大改变。
反复考虑后,我决定 运行 xjc
和 -nv
选项,这会改变某些严格的验证规则。这次收到的error比较清楚了,立马指出原因,显而易见的解决方案:
[ERROR] failed to retrieve 'file:/D:/Projects/xyz/XMLSchema.dtd': java.io.FileNotFoundException: D:\Projects\xyz\XMLSchema.dtd (The system cannot find the file specified)
line 2 of file:/D:/Projects/xyz/xml.xsd
显然,XJC 尝试下载 DOCTYPE 声明引用的 DTD:
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
实际上,这不是 XJC,而是 XSD 验证之前的 XML 解析器。使用的 XML 解析器是一个验证解析器,这意味着它会尝试找到 DTD,如果找不到,它就会中断。您收到的错误不是很有用,但是是正确的,在 XML 术语中,指向 DTD 的 XML 文件不是有效的 XML 文件(但它可以很好-formed XML 文件和非验证 XML 处理器,不要与 XSD 模式验证混淆,将简单地加载 XML)。
解决方案
但是,XML 不需要 DTD 就被认为是正确的。您可以 download the XMLSchma DTD,或者更简单 只需删除该行,处理就会成功 ,有或没有 -nv
开关。
您可以使用 目录 来修复此类错误:
- 假设您的一个或多个模式通过无效 URL 引用资源。
- 找到此资源(可能可以从其他位置获得)并将其保存在本地。
- 创建目录文件以重写 URL。您可以通过命名空间或通过文件位置重写:
PUBLIC "http://www.w3.org/XML/1998/namespace" "w3c/2001/03/xml.xsd"
REWRITE_SYSTEM "http://www.w3.org/2001/03/xml.xsd" "w3c/2001/03/xml.xsd"
(本地文件位置是 w3c/2001/03/xml.xsd
。)
- 用作
xjc -catalog mycatalog.cat ...
您也可以对 DTD 执行相同的操作。我通常只重写 "http://www.w3.org"
-> "w3c"
并保持文件夹结构与服务器上的相同。
使用 -nv
是个好主意,在任何情况下都可以更好地使用目录:
链接:
我正在尝试 运行 xjc 第三方模式文件(它是 Amazon.com 的产品 API)。好吧,我 运行 遇到了麻烦,因为其中一个文件,default.xsd,xjc 在下面的导入中很无聊(它是模式声明之后的第一个导入):
<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd" />
我不是 XML 方面的专家,但我认为 xml.xsd 是 "core" XML/XSD 库的一部分,XJC 会知道这方面的详细信息默认情况下的库。但是当我 运行 任务时,我得到这个错误:
[WARNING] schema_reference.4: Failed to read schema document 'xml.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not . line 9 of file:/C:/temp/amazon/default.xsd
[ERROR] src-resolve: Cannot resolve the name 'xml:lang' to a(n) 'attribute declaration' component. line 119 of file:/C:/temp/amazon/default.xsd
我尝试将 xml.xsd 文件从 http://www.w3.org/2001/03/xml.xsd 下载到包含这些架构文件的目录并再次 运行 命令,但 xml.xsd 未验证:
[ERROR] schema_reference.4: Failed to read schema document 'file:/C:/temp/amazon/xml.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not . unknown location
我正要开始探究为什么这不会被验证,但决定推迟,因为我认为我遗漏了一些非常简单或小的东西。我需要手动包含 xml.xsd 导入还是我遗漏了其他东西?
我正在使用的模式的 url 当前在这里:
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 目录名 一起或 xjc 文件名 尝试逐一解析它们
我下载了您的 XSD 文件来模仿错误,事实上,当按原样下载时,它们给出的正是您报告的错误。
目前还不清楚发生了什么。是的,XML 命名空间 http://www.w3.org/XML/1998/namespace
是特殊的和保留的。您不必声明它就存在,但是 xml.xsd
文件用于 Schema compliance,因此这些预定义类型也在 XSD Schema 中定义,因此类型可以用于使用模式。
所以我的第一个想法是需要将 XML 命名空间声明为 xmlns:xml="http://www.w3.org/XML/1998/namespace"
(通常不需要)XJC 才能正常运行,但这并没有太大改变。
反复考虑后,我决定 运行 xjc
和 -nv
选项,这会改变某些严格的验证规则。这次收到的error比较清楚了,立马指出原因,显而易见的解决方案:
[ERROR] failed to retrieve 'file:/D:/Projects/xyz/XMLSchema.dtd': java.io.FileNotFoundException: D:\Projects\xyz\XMLSchema.dtd (The system cannot find the file specified) line 2 of file:/D:/Projects/xyz/xml.xsd
显然,XJC 尝试下载 DOCTYPE 声明引用的 DTD:
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
实际上,这不是 XJC,而是 XSD 验证之前的 XML 解析器。使用的 XML 解析器是一个验证解析器,这意味着它会尝试找到 DTD,如果找不到,它就会中断。您收到的错误不是很有用,但是是正确的,在 XML 术语中,指向 DTD 的 XML 文件不是有效的 XML 文件(但它可以很好-formed XML 文件和非验证 XML 处理器,不要与 XSD 模式验证混淆,将简单地加载 XML)。
解决方案
但是,XML 不需要 DTD 就被认为是正确的。您可以 download the XMLSchma DTD,或者更简单 只需删除该行,处理就会成功 ,有或没有 -nv
开关。
您可以使用 目录 来修复此类错误:
- 假设您的一个或多个模式通过无效 URL 引用资源。
- 找到此资源(可能可以从其他位置获得)并将其保存在本地。
- 创建目录文件以重写 URL。您可以通过命名空间或通过文件位置重写:
PUBLIC "http://www.w3.org/XML/1998/namespace" "w3c/2001/03/xml.xsd"
REWRITE_SYSTEM "http://www.w3.org/2001/03/xml.xsd" "w3c/2001/03/xml.xsd"
(本地文件位置是w3c/2001/03/xml.xsd
。) - 用作
xjc -catalog mycatalog.cat ...
您也可以对 DTD 执行相同的操作。我通常只重写 "http://www.w3.org"
-> "w3c"
并保持文件夹结构与服务器上的相同。
使用 -nv
是个好主意,在任何情况下都可以更好地使用目录:
链接: