我正在尝试在第三方的架构文件(它是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会知道该库的详细信息。但是当我运行任务时,我收到了这个错误:
[警告] 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 尝试逐个解析它们
答案 0 :(得分:2)
您可以使用目录来修复此类错误:
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"
- &gt; "w3c"
并保持文件夹结构与服务器上的相同。
使用-nv
是一个好主意,在任何情况下都可以更好地使用目录:
链接:
答案 1 :(得分:1)
我下载了您的XSD文件以模仿错误,实际上,当他们按原样下载时,他们会准确地说明您报告的错误。
发生的事情并不是很明显。是的,XML名称空间http://www.w3.org/XML/1998/namespace
是特殊的并且是保留的。您不必声明它存在,但xml.xsd
文件用于Schema合规性,因此这些预定义类型也在XSD架构中定义,以便可以在使用时使用这些类型模式。
所以我首先想到的是,XML命名空间需要被声明为xmlns:xml="http://www.w3.org/XML/1998/namespace"
(通常这是永远不需要的),以便XJC正常运行,但这并没有太大变化。
经过一段时间的反复,我决定使用选项xjc
运行-nv
,这会转变某些严格的验证规则。这一次,我收到的错误更清楚,并立即指出原因,以及明显的解决方案:
[ERROR]无法检索'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" >
实际上,这不是XJC,而是XSD验证之前的XML解析器。使用的XML解析器是一个验证解析器,这意味着它尝试查找DTD,如果不能,则会中断。您收到的错误不是很有帮助,但正确,如在XML术语中,指向DTD的XML文件不是有效的XML文件(但它可以是格式良好的XML文件和非验证XML处理器,而不是要与XSD架构验证混淆,只需加载XML)。
但是,XML不需要DTD才能被认为是正确的。您可以download the XMLSchma DTD,或者更轻松,只需删除该行,处理就会成功,无论是否有-nv
切换。