2009-06-18 6 views
2

J'ai remarqué que différents schémas XML définissent les éléments enfants différemment. Certains les définir directement sous les nœuds parents comme ceci:Avantages/inconvénients pour les conteneurs pour les nœuds enfants en XML?

<parent> 
    <foo /> 
    <foo /> 
    ... 
    <foo /> 
    <bar /> 
    <bar /> 
    ... 
    <bar /> 
</parent> 

alors que d'autres définissent des noeuds de conteneurs autour des nœuds enfants comme ceci:

<parent> 
    <foos> 
     <foo /> 
     <foo /> 
     ... 
     <foo /> 
    </foos> 
    <bars> 
     <bar /> 
     <bar /> 
     ... 
     <bar /> 
    </bars> 
</parent> 

Je n'ai pas eu de problèmes sérialisation/désérialisation en soit le cas échéant, et je ne vois aucune raison de préférer l'une à l'autre.

Que (le cas échéant) sont les avantages/inconvénients de chaque approche?

Répondre

1

Eh bien, le second est plus "intuitive". Est plus hiérarchique. Par exemple, vous avez celui-ci:

<animal> 
<snakes> 
    <boa /> 
    <python /> 
</snakes> 
<monkeys> 
    <red_ass_monkey /> 
    <yellow_monkey /> 
</monkeys> 
</animal> 

Je certainement choisir le second lorsque vos objets sont en quelque sorte liés hirearchical, parce est plus logique. Aussi quand tu te lis pour modifier quelque chose directement dans le xml (juste au cas où) tu trouveras mieux ton chemin, sachant qu'un python est un serpent qui est un animal (Celui-là quand la chose se complique), mieux vaut chercher dans l'ensemble liste.

1

une possibilité pour une telle structure serait si vous avez besoin de regrouper certains <foo/> s ensemble dans un ensemble répétitif:

`

<foos id=1> 
    <foo /> 
    <foo /> 
    ... 
    <foo /> 
</foos> 
<foos id=2> 
    <foo /> 
    <foo /> 
    ... 
    <foo /> 
</foos> 

`

+1

+1 point positif. Sauf si je voulais ajouter un attribut/élément, il n'y a aucun moyen de distinguer les groupes de nœuds de même nom – micahtan

1

Le premier système est extensible et pas si difficile à implémenter, il suffit de parcourir tous les childNodes de parent et de vérifier si l'espace de noms et le nom de l'élément correspondent à tout ce que vous pouvez lire. Cependant, parfois, le fractionnement peut être favorable, en particulier lorsque le traitement bars dépend de tous foos ou plus.

Pour emprunter un exemple:

<zoo xmlns="http://example.org/zoo" xmlns:z="http://example.org/zoo"> 
<cages> 
    <cage name="open-air" /> 
    <cage name="glass-cage" /> 
</cages> 
<animals> 
    <monkey name="Orlan" cage="open-air"/> 
    <monkey name="Jeremey" cage="glass-cage"/> 
    <snake name="spssshs" cage="glass-cage"/> 
    <panda xmlns="http://china.cn/zoo" z:name="Ying Ying" z:cage="open-air"/> 
</animals> 
</zoo> 

Ainsi, la séparation cages et animals est logique. Cependant, si vous aviez regroupé les animaux dans des singes et des serpents, vous auriez besoin d'ajouter beaucoup de logique de traitement supplémentaire pour les pandas.

+0

Lorsque le traitement des barres dépend de foos, comment l'ajout du nœud de conteneur aide-t-il? Dans votre exemple, ne pouvez-vous pas traiter les noeuds de la cage sans les emballer dans le noeud des cages? – micahtan

+0

@micahthan Oui, mais seulement si vous chargez le document complet avant d'effectuer une analyse, de sorte que vous excluez quiconque utilisant des analyseurs d'accès en série. De plus, même si vous chargez tout d'abord le document complet, le traitement devient plus compliqué et plus lent: vous parcourez généralement l'arborescence entière deux fois et vous avez également besoin de deux comparaisons avec l'espace de noms. – phihag

+0

@phihag - Ne pourrais-je définir la XSD d'utiliser une séquence pour forcer tous les éléments au début, dans ce cas, vous obtenez toujours l'avantage de l'analyse syntaxique série w/o avoir à envelopper les éléments à l'intérieur d'un élément ? – micahtan

Questions connexes