2009-03-24 10 views
0

Lorsque j'utilise un fichier d'exemple XML pour générer un XSD, en utilisant à la fois Visual Studio et Oxygen, il génère un fichier utilisant des tonnes de <xs:element ref="ELEMENTNAME" />, où elementname est un nom d'élément réel. Plus tard dans le fichier, il a un élément <xs:element name="ELEMENTNAME" type="xs:string" /> où il définit ce qu'est cet élément. Par exemple, voici un extrait:Générer un fichier XSD sans éléments REF - Je veux juste un fichier XSD "littéral"

<xs:element name="Header"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="VersionNumber" /> 
     <xs:element ref="BillerGroupID" /> 
     <xs:element ref="BillerGroupShortName" /> 
     <xs:element ref="BillerID" /> 
     <xs:element ref="BillerShortName" /> 
     <xs:element ref="FileIndicator" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:element name="VersionNumber" type="xs:string" /> 
<xs:element name="BillerGroupID" type="xs:string" /> 
<xs:element name="BillerGroupShortName" type="xs:string" /> 
<xs:element name="BillerID" type="xs:string" /> 
<xs:element name="BillerShortName" type="xs:string" /> 
<xs:element name="FileIndicator" type="xs:string" /> 

est ici le problème - j'utilise Microsoft Biztalk, et il voit chaque tag « élément » comme un schéma disponible parce qu'ils sont tous au niveau de la racine - En-tête, avec chaque élément enfant unique. Je veux juste rendre un schéma disponible - en-tête, dans ce cas - et cacher le reste.

La solution évidente semble être de modifier manuellement mon dossier pour ressembler à ceci, supprimer manuellement les déclarations REF:

<xs:element name="Header"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="VersionNumber" type="xs:string" /> 
     <xs:element name="BillerGroupID" type="xs:string" /> 
     <xs:element name="BillerGroupShortName" type="xs:string" /> 
     <xs:element name="BillerID" type="xs:string" /> 
     <xs:element name="BillerShortName" type="xs:string" /> 
     <xs:element name="FileIndicator" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Cependant, étant donné que mon dossier est énorme et contient des milliers d'éléments, ce n'est pas vraiment faisable. Existe-t-il un moyen de dire à mon outil de générer le fichier sans utiliser REFs, mais plutôt de simplement placer une copie de l'élément là où elle devrait être au lieu de la racine?

Répondre

3

Si vous avez un projet Visual Studio BizTalk, vous pouvez choisir "Ajouter des éléments générés .." puis "Générer des schémas". Dans la liste déroulante, choisissez "Bien formé xml", si personne n'a utilisé cette option avant de lancer un script pour l'activer, voir le lien ci-dessous.

VS va maintenant générer le type de schéma que vous voulez. Vous devrez ajuster les types de données si VS deviné mal :)

Voir ce la personne échantillon Add generated schemas

+0

J'ai dû installer l'option "XML bien formé", mais cela a fonctionné comme un charme, sans un seul REF. Merci pour votre conseil! – SqlRyan

0

Je suppose qu'il serait relativement facile d'écrire un XSLT qui effectue cette transformation pour vous. Vous pouvez détecter les attributs ref et utiliser la valeur dans XPath pour trouver la définition réelle, puis la copier dans la sortie. Ne devrait pas être très difficile à écrire.

+0

Je peux écrire la transformation, mais pourquoi ne peux pas l'outil simplement générer le fichier de cette façon en premier lieu? Je comprends le point de la REF, dans le cas où vous avez plusieurs copies d'un élément, mais il semble que je devrais être en mesure de vérifier une boîte qui crée un fichier sans eux. – SqlRyan

+0

Semble que vous cherchez des outils pour contourner les lacunes d'autre chose. Vous trouverez probablement un outil qui le fait quelque part, mais le XSLT est probablement plus rapide à écrire et signifie que vous n'avez pas besoin d'ajouter un autre outil. –

0

Quelle version de VS utilisez-vous? J'ai essayé votre exemple dans Visual Studio 2008, et il a généré le XSD la façon dont vous semblez vouloir:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Header"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="VersionNumber" type="xs:string" /> 
     <xs:element name="BillerGroupID" type="xs:string" /> 
     <xs:element name="BillerGroupShortName" type="xs:string" /> 
     <xs:element name="BillerID" type="xs:string" /> 
     <xs:element name="BillerShortName" type="xs:string" /> 
     <xs:element name="FileIndicator" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Il ressemble VS 2005 ferait la même chose. J'ai regardé dans les boîtes de dialogue Options VS, mais je n'ai rien vu qui puisse contrôler la façon dont la XSD est générée. (Peut-être y at-il un fichier de configuration quelque part?)

+0

Bien que cela fonctionne sur le petit exemple que j'ai fourni, il génère quand même un schéma avec beaucoup de REFs quand je lance l'ensemble du fichier XML dans VS2008. Merci pour l'idée, cependant! – SqlRyan