【问题标题】:Namespaces in xml when two schemas used使用两个模式时 xml 中的命名空间
【发布时间】:2018-01-30 07:59:32
【问题描述】:

我有一个定义了 xml 架构的主 xsd 文件和第二个包含扩展名的 xsd 文件。我需要这样的东西:

<ns:Node>
    <InnerNode>
        <Value1>value 1</Value1>
        <Value2>value 2</Value2>
    </InnerNode>
</ns:Node>

InnerNode 定义在主文件中,Node 在扩展文件中。我的扩展定义如下:

<xs:element name="Node">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="InnerNode" type="InnerNodeType"/>
        </xs:sequence>
    </xs:complexType>       
</xs:element>

命名空间在两种模式中都定义,我对这两种模式都有导入。当我使用示例 xml 验证架构时,我收到错误消息,即 InnerNode 也应该具有命名空间,而不仅仅是 Node 元素。我尝试使用带有非限定值的 form 属性,但没有帮助 - 验证器 (XMLSpy) 建议插入空的 xmlns 属性。

是否可以定义不需要命名空间的 InnerNode 元素(缺少一些属性)?

编辑: 我没有提到在主 xsd 文件中我使用 Node 类型作为更大结构的一部分(它可能使它更复杂一点):

<OuterNode> <!-- defined in main xsd -->
    <ns:Node> <!-- defined in imported -->
        <InnerNode> <!-- defined in main -->
            <Value1>value 1</Value1>
            <Value2>value 2</Value2>
        </InnerNode>
    </ns:Node>    
</OuterNode>

这样可以吗?

【问题讨论】:

  • 有点技术性:您实际上有一个由两个模式文档组成的模式。不过不用担心,知道的人不多。

标签: xml xsd


【解决方案1】:

如果 InnerNode 元素是在单独的架构文档的元素声明中定义的,那么您需要 ref="InnerNode" 而不是 name="InnerNode"。 (使用 name= 创建一个允许任何内容的本地元素声明)。

或者,如果 InnerNode 元素的类型在单独的架构文档中定义,那么您可以使用name="InnerNode" type="InnerNodeType"

无论哪种方式,如果另一个模式文档的目标命名空间不存在(即它是一个无命名空间模式文档),那么“type”或“ref”的值需要是一个无命名空间 QName。这意味着包含元素不能在范围内具有默认命名空间。但你的:xmlns="http://www.additional.org"。所以你需要通过取消声明来取消它:

<xsd:element ref="InnerNode" xmlns=""/>

<xsd:element name="InnerNode" form="unqualified" type="InnerNodeType" xmlns=""/>

【讨论】:

  • 感谢您的重播。我已经尝试过了,但我仍然必须在 xml.xml 中有 xmlns="" 属性。有什么办法可以解决这个问题吗?
  • 如果有一个带有xmlns="something.else"形式的命名空间声明的外部元素,您只需要在XML实例中使用xmlns=""
  • 所以在我的情况下,我的 xml 需要看起来像:value 1value 2值2> ?对吗?
  • 不,正如我所说,你不应该在实例中需要xmlns="",除非是取消外部xmlns="something.else"
【解决方案2】:

我进行了一些研究,得到了以下结果:

如果您在主要方案中添加 elementFormDefault="unqualified" 同时在扩展方案中将 form="unqualified" 添加到元素 InnerNode 的定义中

   <xs:element name="Node">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="InnerNode" form="unqualified" type="InnerNode"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

它将正常工作和验证。

我附上了以下方案的示例:

main.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.main.org" targetNamespace="http://www.main.org" elementFormDefault="unqualified">
  <xsd:complexType name="InnerNodeType">
    <xsd:sequence>
      <xsd:element name="Value1" type="xsd:string"/>
      <xsd:element name="Value2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

附加.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.additional.org" targetNamespace="http://www.additional.org"
            xmlns:ext="http://www.main.org" elementFormDefault="qualified">
  <xsd:import schemaLocation="main.xsd" namespace="http://www.main.org"/>
  <xsd:element name="Node">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="InnerNode" type="ext:InnerNodeType" form="unqualified"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

【讨论】:

  • 感谢您的回复。我试过了,但它没有解决我的问题 - 需要 xmlns="" 属性才能通过验证。
  • 希望我能正确理解这个问题。因此,我创建了两个简单的 xsd:主要的一个定义 InnerNodeType,而附加的一个定义 Node 元素。我从这个 xsd 得到了 xml。看起来你已经加入了
  • 我无法使用 form="unqualified" 属性摆脱 xmlns="" 属性。我的情况比较复杂,忘了说外部结构了。请查看我对问题的编辑。
  • 主模式和扩展模式是否都在同一个命名空间中定义?
  • 主要xsd:sample/namespace" xmlns:xs="w3.org/2001/XMLSchema" xmlns:ns="client" targetNamespace="sample/namespace" elementFormDefault= "qualified" attributeFormDefault="unqualified"> 扩展名: w3.org/2001/XMLSchema" xmlns="sample/namespace" xmlns:ns="client" targetNamespace="client" elementFormDefault ="qualified" 属性FormDefault="unqualified">
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2014-03-03
  • 2012-04-24
  • 2013-10-12
相关资源
最近更新 更多