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

如何将XML架构导入“无命名空间”

  •  4
  • Zombies  · 技术社区  · 14 年前

    我在这里有一个模式,我试图包含/导入另一个没有名称空间的模式(这是无法更改的,因为它来自另一个供应商,并且不再验证其XML)。以下是第一个模式:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:samp="http://sample/namespace" 
    targetNamespace="http://sample/namespace" 
    elementFormDefault="unqualified" attributeFormDefault="unqualified"
    xmlns:otr1="http://sample/import/namespace1" 
    xmlns:otr2="http://sample/import/namespace2">
    
    <xs:import namespace="http://sample/import/namespace1" schemaLocation="other1.xsd" />
    <xs:import namespace="http://sample/import/namespace2" schemaLocation="other2.xsd"  />
    <!-- This one below is having problems, it is valid XML, and I am able to use it
    but I am not meeting the actual requirments I have (explained later) -->
    <xs:include schemaLocation=="NO_NAME_SPACE_PROBLEM.xsd"/>
    
    ...
    <xs:element ref="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/>
    ...
    
    
    </xs:schema>
    

    以及“no-name-space-shema-problem.xsd”,可以在某种程度上进行更改,但不能具有命名空间。

    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
         elementFormDefault="unqualified" attributeFormDefault="unqualified">
    
     <xsd:element name="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA" 
        type="xsd:string" nillable="true"/>
    
    </xs:schema>
    

    问题是 some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA 正在放入 samp 命名空间。所以当我尝试将其整理成XML时,它会打印出来 <samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA><child-elem/></samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA> 这是一个大问题,因为XML不会验证,因为它不应该验证。所以我的目标是简单地将元素导入到无名称空间中。

    更新1 :很抱歉出现混淆,我以前和现在都在使用xs:include,而不是xs:import作为无名称空间架构。问题语法已更新。我还使用jibx codegen生成域对象,并使用jibx绑定进行编组。所以它也必须是JiBX兼容的。

    更新2 :根据斯卡夫曼的回答,我现在将使用xs:import。我想我会把这个问题扩展到一个新问题上。

    1 回复  |  直到 14 年前
        1
  •  3
  •   skaffman    14 年前

    你试过了吗?

    <xs:import namespace="" schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/>
    

    有趣的是,XML模式规范 strongly suggests 那个

    <xs:import schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/>
    

    应该导入 NO_NAME_SPACE_PROBLEM.xsd 进入“无名称空间”。如果您的环境不是将其导入封闭模式文档的名称空间,那么我很确定这是您平台中的一个bug。


    更新 :好的,您的更新显示您正在尝试使用 <xs:include> 引用其他命名空间中的类型。你不能这样做- <包括: 总是 将包含的项放入与父架构文档相同的命名空间中。如果它们用于不同的命名空间,则必须使用 <xs:import> .

    如果要引用导入的无名称空间架构中的一个元素定义,则需要找到一种方法来为“无名称空间”名称空间分配前缀。如果它有前缀,您可以这样引用它们:

    <xs:element ref="nn:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/>
    

    尝试添加属性 xmlns:nn="" 到父架构文档,查看是否有效。