2010-11-30 5 views
0

J'essaie d'analyser la structure ci-dessous en un ensemble d'options de parcours afin que je puisse trouver toutes les manières possibles d'aller de Pontypridd à Llangollen et retour.XPath: Sélectionnez tous les nœuds suivants jusqu'à un nœud

En utilisant XPath, je peux faire //div[@class='JourneyOptions'] pour sélectionner toutes les lignes qui contiennent réellement des informations de trajet. En dehors de XPath, je pouvais parcourir chaque rangée pour décider si elle devait être ajoutée à un ensemble de voyages, ou si c'était la première fois dans un nouvel ensemble de voyages. Dans l'exemple ci-dessous, tous les ensembles de trajets contiennent deux trajets, mais un ensemble peut contenir un seul trajet (un trajet «direct») ou plus de deux (plus d'une «connexion»).

Existe-t-il une expression XPath pour sélectionner tous les trajets du premier ensemble sortant, tous les trajets du deuxième ensemble sortant et ainsi de suite?

Le premier trajet dans chaque ensemble a une entrée radio avec une valeur entière. Je pourrais les générer dynamiquement pour voir chaque ensemble, mais je devrais savoir quand arrêter la génération (ou attendre que le XPath échoue).

<div class='TableHolder'> 

    <p>...</p> 
    <h2 id='DirectionHeader'>Outbound Options</h2> 
    <p>Pontypridd to Llangollen, 30/11/1910</p> 

    <!-- first part of the first journey from Pontypridd to Llangollen --> 
    <div class='JourneyOptions'> 
    <div class='Journey'> 
     <div class='ColumnOne'> 
      <input type='radio' checked='checked' name='out' value='1'> 
     </div> 
     ... some more divs of parseable journey info ... 
    </div> 
    <div> 

    <!-- second part of the first journey from Pontypridd to Llangollen --> 
    <div class='JourneyOptions'> 
    <div class='Journey'> 
     <div class='ConnectingJournies'> 
      <p>...</p> 
     </div> 
     <div class='ColumnOne'> 
      ... doesn't contain a radio input ... 
     </div> 
     ... some more divs of parseable journey info ... 
    </div> 
    </div> 

    <!-- first part of the second journey from Pontypridd to Llangollen --> 
    <div class='JourneyOptions'> 
    <div class='Journey'> 
     <div class='ColumnOne'> 
      <input type='radio' name='out' value='2'> 
     </div> 
     ... some more divs of parseable journey info ... 
    </div> 
    <div> 

    <!-- second part of the second journey from Pontypridd to Llangollen --> 
    <div class='JourneyOptions'> 
    <div class='Journey'> 
     <div class='ConnectingJournies'> 
      <p>...</p> 
     </div> 
     <div class='ColumnOne'> 
      ... doesn't contain a radio input ... 
     </div> 
     ... some more divs of parseable journey info ... 
    </div> 
    </div> 

    ... some more outbound journey options ... 

    <p>...</p> 
    <h2 id='DirectionHeader'>Inbound Options</h2> 
    <p>Llangollen to Pontypridd, 07/11/1910</p> 

    <!-- first part of the first journey from Llangollen to Pontypridd --> 
    <div class='JourneyOptions'> 
    <div class='Journey'> 
     <div class='ColumnOne'> 
      <input type='radio' checked='checked' name='in' value='1'> 
     </div> 
     ... some more divs of parseable journey info ... 
    </div> 
    <div> 

    <!-- second part of the first journey from Llangollen to Pontypridd --> 
    <div class='JourneyOptions'> 
    <div class='Journey'> 
     <div class='ConnectingJournies'> 
      <p>...</p> 
     </div> 
     <div class='ColumnOne'> 
      ... doesn't contain a radio input ... 
     </div> 
     ... some more divs of parseable journey info ... 
    </div> 
    </div> 

    <!-- first part of the second journey from Llangollen to Pontypridd --> 
    <div class='JourneyOptions'> 
    <div class='Journey'> 
     <div class='ColumnOne'> 
      <input type='radio' name='in' value='2'> 
     </div> 
     ... some more divs of parseable journey info ... 
    </div> 
    <div> 

    <!-- second part of the second journey from Llangollen to Pontypridd --> 
    <div class='JourneyOptions'> 
    <div class='Journey'> 
     <div class='ConnectingJournies'> 
      <p>...</p> 
     </div> 
     <div class='ColumnOne'> 
      ... doesn't contain a radio input ... 
     </div> 
     ... some more divs of parseable journey info ... 
    </div> 
    </div> 

    ... some more inbound journey options ... 
</div> 

Désolé pour le grand exemple, mais je pense que cela est aussi petit que je peux le faire, tout en étant représentatif de mon problème.

Répondre

0

Les ensembles de noeuds sont juste ... eh bien, ensembles: dépendances du langage hôte ordonnées (ordre du document pour la plupart) des noeuds uniques. Si vous voulez que le résultat exprime une sorte de hiérarchie ou de regroupement, la réponse est que vous ne pouvez pas.

Ainsi, vous pouvez sélectionner le début de chaque groupe:

/div[@class='TableHolder'] 
    /div[@class='JourneyOptions'] 
     [div[@class='Journey'] 
      /div[@class='ColumnOne'] 
       /input[@type='radio'] 
     ] 

Un groupe à l'époque (il y a beaucoup d'options):

/div[@class='TableHolder'] 
    /div[@class='JourneyOptions'] 
     [count(
      (self::div|preceding-sibling::div) 
       [div[@class='Journey'] 
        /div[@class='ColumnOne'] 
         /input[@type='radio'] 
       ] 
      ) = 1 
     ] 
Questions connexes