<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd" />
我不是XML专家,但我认为xml.xsd是“核心”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 dirname
立刻在一起或
xjc文件名
尝试逐个解析它们
发生的事情并不是很明显.是的,XML名称空间http://www.w3.org/XML/1998/namespace是特殊的并且是保留的.您不必声明它是否存在,但xml.xsd文件用于Schema合规性,因此这些预定义类型也在XSD架构中定义,以便可以在使用架构时使用这些类型.
所以我的第一个想法是需要将XML命名空间声明为xmlns:xml =“http://www.w3.org/XML/1998/namespace”(通常这是永远不需要的),以便XJC正常运行,但是变化不大.
经过一段时间的来回,我决定使用选项-nv运行xjc,这会转换某些严格的验证规则.这一次,我收到的错误更清楚,并立即指出原因,以及明显的解决方案:
[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文件(但它可以是格式良好的XML文件和非验证XML处理器,而不是要与XSD架构验证混淆,只需加载XML).
解
但是,XML不需要DTD才能被认为是正确的.您可以使用download the XMLSchma DTD,或者更简单地删除该行,并且无论是否使用-nv开关,处理都将成功.