2013-02-07 6 views
0

étant donné que mon XSD ne fonctionne pas avec Visual Studio 2010, je l'ai utilisé pour en générer un. La différence entre le mien et le Généré est la hiérarchie? J'utilise dtype pour appeler les types complexes. Pourquoi ça ne marche pas?XML Schema xsd interdisant le type

Version Visual Studio:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      targetNamespace="top.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="top"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="child1"> 
      <xs:complexType> 
      <xs:attribute name="attribute1" type="xs:string" /> 
      </xs:complexType> 
     </xs:element>  
     <xs:element name="child2"> 
      <xs:complexType> 
      <xs:attribute name="attribute2" type="xs:string" /> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Je trouve personellement ma version soignée, mais arrive avec une erreur de ce type ne peut pas être utilisé comme référence à ce point:

<?xml version="1.0" encoding="utf-8"?> 
    <xs:schema attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      targetNamespace="top.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="top"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="chield1" type="chield1" /> 
      <xs:element name="chield2" type="chield2" /> 
     </xs:sequence> 
    </xs:element> 
    <xs:complexType name="chield1"> 
     <xs:attribute name="attribute1" type="xs:string" /> 
    </xs:complexType> 
    <xs:complexType name="chield2"> 
     <xs:attribute name="attribute2" type="xs:string" /> 
    </xs:complexType> 
    </xs:schema> 

Répondre

1

Le premier problème est que votre document de schéma n'est pas bien formé. Une fois l'étiquette de fin manquante pour le type complexe de 'top' est fourni, le problème suivant est que vous faites référence à des types nommés chield1 et chield2 dans ce qu'on appelle parfois l'espace de noms nul. Autrement dit, leurs noms étendus n'identifient pas un espace de noms spécifique; XSD et beaucoup d'autres spécifications traitent l'espace de noms nul comme s'il s'agissait simplement d'un autre espace de noms qui n'a pas de nom.

Votre document de schéma, quant à lui, déclare deux types nommés chield1 et chield2 dans l'espace de noms top.xsd. (Ce n'est pas un bon nom d'espace de noms, les noms d'espace de noms devraient être des URI absolus, même si pour des raisons complexes, de nombreux outils n'appliquent pas cette règle.) Vos déclarations pour les éléments chield1 et chield2 ne pointent pas sur ces types. Si vous voulez le faire, les déclarations devraient dire quelque chose comme:

<xs:element name="chield1" 
      type="tns:chield1" 
      xmlns:tns="top.xsd" /> 
<xs:element name="chield2" 
      type="tns:chield2" 
      xmlns:tns="top.xsd" /> 

Dans la pratique, bien sûr, la déclaration d'espace de noms pour tns peut aller sur un ancêtre commun des déclarations d'éléments, au lieu; un modèle commun est de le mettre sur l'élément de schéma.