使用sql注释支持xsd中的递归关系

时间:2014-08-07 18:36:32

标签: xml xsd bulk-load

我有以下xsd,我无法弄清楚为什么它"Namespace is not available to be referenced in this schema"上有错误"element"以及如何修复它:

<xsd:schema attributeFormDefault="unqualified" 
    elementFormDefault="qualified"
    targetNamespace="http://www.w3.org/2001/XMLSchema"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:sql="urn:schemas-microsoft-com:mapping-schema">

  <xsd:annotation>
    <xsd:appinfo>
      <sql:relationship name="PlayerPlayer"
      parent="xmlTest"
      parent-key="PlayerID"
      child="xmlTest"
      child-key="ParentID" />
    </xsd:appinfo>
  </xsd:annotation>



    <xsd:element name="team">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="player" type="playerType" 
           maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>


  <xsd:complexType name="playerType">
    <xsd:sequence>
      <xsd:element name="playerID" type="xsd:ID"/>
      <xsd:element name="playerName" type="xsd:string"/>
      <xsd:element name="playerCap" type="playerType" 
        minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

</xsd:schema>

当我删除type="playerType"时,没有错误。但我需要它,因为我想支持递归关系。我还需要sql,因为我需要在数据库中使用Xml Bulk Load。

以下是您需要的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<team xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xsi:noNamespaceSchemaLocation='TestRecursive.xsd'>


  <player>
    <playerID>c1</playerID>
    <playerName>Tommy Jones</playerName>
    <playerCap>
        <playerID>c2</playerID>
        <playerName>Eddie Thomas</playerName>
        <playerCap>
            <playerID>c4</playerID>
            <playerName>Patrick O’Shea</playerName>
        </playerCap>
    </playerCap>
  </player>
</team>

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

从根@targetNamespace="http://www.w3.org/2001/XMLSchema"元素中删除xsd:schema,错误就会消失。

@targetNamespace表示由XSD管理的XML文档实例的XML名称空间。您几乎肯定不希望XML文档位于XSD名称空间中。

事实上,您的示例XML不使用名称空间,因此您根本不需要@targetNamespace。如果您确实想要使用名称空间,那么您对playerType的引用必须以声明与@targetNamespace的值匹配的名称空间前缀作为适当的前缀。

最后注意xmlns:sql="urn:schemas-microsoft-com:mapping-schema"的声明与错误没有任何关系。