代码之家  ›  专栏  ›  技术社区  ›  Elliot

为什么我的JAXB解组器找不到导入模式中声明的元素?

  •  2
  • Elliot  · 技术社区  · 15 年前

    我有两个模式A和B具有循环依赖关系(这是一个中间步骤)。根据xmllint和visualstudio,我使用的作为输入的XML文件根据模式进行验证。Eclipse告诉我两个模式都包含两个同名的全局组件。

    A.xsd码:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance"
      targetNamespace="http://foo.org/A"
      xmlns="http://foo.org/A"
      elementFormDefault="unqualified"
      attributeFormDefault="unqualified">
    
    <xs:import schemaLocation="b.xsd" />
    

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance"
      xmlns:foo="http://foo.org/A"
      elementFormDefault="unqualified"
      attributeFormDefault="unqualified">
    
      <xs:import namespace="http://foo.org/A" schemaLocation="a.xsd" />
    

    我传递给解组器的XSD是A.XSD。当遇到B.xsd中定义的元素时,它会抱怨:

    InputStream in = .. A.xsd
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    return factory.newSchema(new StreamSource(in);
    

    有人能解释我做错了什么吗?谢谢

    1 回复  |  直到 15 年前
        1
  •  1
  •   skaffman    15 年前

    <xs:import> schemaLocation 属性只不过是一个关于在哪里找到另一个名称空间的提示。

    B.xsd ,您的意思是要导入命名空间 http://blah.org ,并且该命名空间由中的架构处理 A.xsd

    A.xsd公司 B.xsd公司 未指定要导入的命名空间。

    A.xsd公司 B.xsd公司 表示不同的名称空间 import

    另一方面,如果您只是尝试将另一个模式文件中的元素内联到同一命名空间中,那么 include 指令更合适。


    好吧,既然看到了你的模式片段,我可以这么说 <xs:import> A.xsd公司 在同一命名空间中定义元素( http://foo.org/A <xs:include> 相反

    <xs:import> ,并且该导入的名称空间是它已经知道的名称空间,然后它实际上会忽略它。所以在分析过程中 B.xsd公司 http://foo.org/A ),并找到同一命名空间的导入,则忽略它。