当前位置 : 主页 > 网页制作 > xml >

使用XJC和xml.xsd导入时出错:“无法读取模式文档’xml.xsd’”

来源:互联网 收集:自由互联 发布时间:2021-06-13
我正在尝试在第三方的架构文件(它是Amazon.com的产品API)上运行xjc.好吧,我遇到了麻烦,因为有一个文件,default.xsd,xjc在下面的导入中是borking(它是模式声明后的第一个): import namespace="http
我正在尝试在第三方的架构文件(它是Amazon.com的产品API)上运行xjc.好吧,我遇到了麻烦,因为有一个文件,default.xsd,xjc在下面的导入中是borking(它是模式声明后的第一个):

<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文件名
尝试逐个解析它们

我下载了你的XSD文件以模仿错误,实际上,当它们按原样下载时,它们会准确地给出你报告的错误.

发生的事情并不是很明显.是的,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开关,处理都将成功.

网友评论