2009-08-19 6 views
1

Je pense que la solution à mon problème est très facile, mais je ne pouvais pas Fint il Alors, voici:XML Schema: noms différents éléments (séquence)

J'ai un fichier XML qui ont une liste d'éléments avec des noms différents, mais en séquence. Un exemple:

<DOC> 
<DOC_OBL_1> 
    <TIP_DOC_OBL>1</TIP_DOC_OBL> 
</DOC_OBL_1> 
<DOC_OBL_2> 
    <TIP_DOC_OBL>2</TIP_DOC_OBL> 
</DOC_OBL_2> 
<DOC_OBL_3> 
    <TIP_DOC_OBL>3</TIP_DOC_OBL> 
</DOC_OBL_3> 
</DOC> 

Donc, j'ai 3 éléments: DOC_OBL_1, DOC_OBL_2 et DOC_OBL_3. Et oui, il pourrait y avoir le numéro 4, 5, 6, etc. Comme vous pouvez le voir, tous les 3 ont les mêmes éléments à l'intérieur (en fait, ils en ont beaucoup, mais ne sont pas importants maintenant), et je pensais pouvoir déclarer un type général qui pourrait valider ce type de documents.

Comment puis-je valider cela avec un schéma ???

Je sais que c'est un XML très moche (peut-être que ce n'est pas standard, s'il vous plaît dites-moi, je ne sais pas), mais ce n'est pas mon souci de construire ce document. Je dois juste l'analyser, le valider et le transformer.

Répondre

2

Eh bien, bien sûr que vous pouvez! Assez simple en fait: si la structure est la même pour chaque élément, vous pouvez définir un seul <xs:complexType> pour valider, puis utilisez:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="DOC" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="DOC"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="DOC_OBL_1" type="DocType" /> 
     <xs:element name="DOC_OBL_2" type="DocType" /> 
     <xs:element name="DOC_OBL_3" type="DocType" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="DocType"> 
    <xs:sequence> 
     <xs:element name="TIP_DOC_OBL" type="xs:string" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Est-ce que ce travail pour vous? Est-ce qu'il gère tous vos besoins? Comme Zach le fait remarquer assez correctement - cette "solution" est évidemment assez limitée, puisqu'elle ne peut pas traiter un nombre arbitraire d'étiquette DOC_OBL_1, DOC_OBL_2, ...., DOC_OBL_x - le nom et donc le nombre de les étiquettes doivent être connues à l'avance.

C'est regrettable, mais c'est la seule solution, compte tenu de ce XML infirme. La solution REAL serait quelque chose comme:

<DOC> 
    <DOC_OBL id="1"> 
    </DOC_OBL> 
    <DOC_OBL id="2"> 
    </DOC_OBL> 
    ..... 
    <DOC_OBL id="x"> 
    </DOC_OBL> 
</DOC> 

et le schéma XML deviendrait encore plus facile et pourrait faire face à un certain nombre de balises <DOC_OBL>.

Mais le principe GIGO s'applique: Garbage In, Garbage Out ==> structure XML merdique, seule une validation incomplète est possible.

Marc

+1

@marc_s s'il peut y avoir un nombre quelconque de nœuds DOC \ _OBL \ _1, DOC \ _OBL \ _2, DOC \ _OBL \ _N, existe-t-il un moyen de valider par rapport au schéma en faisant une sorte de regex contre le nom de l'élément ? –

+0

Non, ce n'est malheureusement pas possible, j'en ai peur. Vous ne pouvez avoir que le nom de l'étiquette en tant que nom d'élément, ou alors vous devez avoir un nom d'étiquette fixe et la partie variable (numéro séquentiel) dans un attribut de cette étiquette. –

+0

Merci. Je pense que je vais le faire avec au moins 50 éléments (DOC_OBL_1 ... DOC_OBL_50). Entrée laide -> solution laide ..: D Mais ça pourrait marcher, de toute façon. – eLZahR

2

Ses malheureux que les noms d'éléments XML ont essentiellement des numéros de séquence/identifiants en eux. Je dirais que c'est du XML mal défini (non standard).

Dans mon expérience limitée (!), Cela signifie que le schéma xsd devrait avoir tous les éléments "DOC_OBL_N" possibles définis dans la séquence. Ce n'est probablement pas pratique s'il n'y a pas de limite supérieure théorique à leur nombre.

Tant que son xml valide, vous pouvez le charger et compter tous les enfants de l'élément DOC, puis écrire le schéma à la volée, mais cela sonne comme un échec. Cela peut vous obliger à valider manuellement l'instance xml en utilisant des xpaths - une sorte d'approche par force brute et qui ne valide pas techniquement avec un schéma xsd.

+0

L'entrée est un document énorme, donc plus de code qu'un simple Schmea n'est pas viable. – eLZahR

Questions connexes