2010-05-18 5 views
3

XML FragmentXPath: les nœuds qui ont un nœud enfant qui ont un attribut

<component name='Stipulations'> 
     <group name='NoStipulations' required='N'> 
      <field name='StipulationType' required='N' /> 
      <field name='StipulationValue' required='N' /> 
     </group> 
    </component> 
    <component name='NestedParties3'> 
     <group name='NoNested3PartyIDs' required='N'> 
      <field name='Nested3PartyID' required='N' /> 
      <field name='Nested3PartyIDSource' required='N' /> 
      <field name='Nested3PartyRole' required='N' /> 
      <group name='NoNested3PartySubIDs' required='N'> 
       <field name='Nested3PartySubID' required='N' /> 
       <field name='Nested3PartySubIDType' required='N' /> 
      </group> 
     </group> 
    </component> 
    <component name='UnderlyingStipulations'> 
     <group name='NoUnderlyingStips' required='N'> 
      <field name='UnderlyingStipType' required='N' /> 
      <field name='UnderlyingStipValue' required='N' /> 
     </group> 
    </component> 

Ce que je veux tous « groupe » noeuds qui ont un noeud enfant de type « champ » et un nom « StipulationType ».

C'est ce que je l'ai essayé jusqu'à présent:

dictionary.XPathSelectElements("group[field[@name='StipulationType']]") 
dictionary.XPathSelectElements("group[./field[@name='StipulationType']]") 
+0

Bonne question (+1). Voir ma réponse pour une solution qui est souvent plus efficace que d'utiliser '//'. :) –

Répondre

1

Le problème:

dictionary.XPathSelectElements("group[field[@name='StipulationType']]") 

Ceci sélectionne tous les éléments du groupe qui satisfont le prédicat, qui sont des enfants du nœud actuel.

Cependant, vous voulez tous les éléments de groupe (satisfaisant le prédicat) - à partir du fragment XML, on voit clairement que tous les éléments du groupe n'ont pas le même parent.

La solution:

Évaluer l'expression XPath du grand-parents (basé sur le fragment fourni!):

Un exemple serait:

component/group[field[@name='StipulationType']] 

Basé sur le structure du document complet (non fourni), d'autres étapes de localisation pourraient être nécessaires.

Ce qu'il faut éviter:

Évitez l'abréviation // car il peut causer (avec pas de bons optimisation des moteurs XPath) un vaste traversal du sous-arbre entier (même document) qui commence à partir du nœud contre c'est évalué .

2

semble bon. Vous pourriez avoir besoin d'obtenir un peu plus précis avec votre XPath en fonction de la mise en œuvre:

//group[field[@name='StipulationType']] 

ou

/component/group[field[@name='StipulationType']] 

devrait fonctionner

+0

Je vois ce que j'ai fait de mal. Je n'ai pas inclus le // devant le groupe, ce qui est essentiel étant donné ma source xml. (Mon échantillon n'indique pas à quel point les niveaux d'imbrication sont vraiment aléatoires.) –

+0

ah. Oui, en cas de doute, utilisez le '//' pour rechercher à tous les niveaux, mais gardez à l'esprit la pénalité de performance que cela peut entraîner. –

Questions connexes