使用XJC和xml.xsd导入时出错:“无法读取架构文档'xml.xsd'”

时间:2015-09-22 00:24:22

标签: java xml xsd jaxb

我正在尝试在第三方的架构文件(它是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 尝试逐个解析它们

2 个答案:

答案 0 :(得分:2)

您可以使用目录来修复此类错误:

  • 假设您的一个或多个模式通过无效的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" - &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切换。