J'ai la structure suivante où les nœuds enfants sont dans un ordre aléatoire:Comment sélectionner le texte() suivant immédiatement un élément sous XPath?
<span id="outer">
<div style="color:blue">51</div>
<span class="main">Gill</span>$500
<span style="color:red">11</span>
<span></span>James
<div style="color:red">158</div>
<div class="sub">Mary</div>
</span>
Je suis en train de concaténer des chaînes de caractères (en laissant un espace entre les deux) en fonction des conditions:
- Si la couleur de style est "bleu" puis ajoute la valeur du noeud à la chaîne
- Si la classe est "main", alors ajouter la valeur du noeud à la chaîne
- Tout le texte() non inclus dans les balises sera ajouté à la chaîne mais dans l'ordre de traversée de tous les enfant nœuds.
L'exemple de sortie de la structure ci-dessus devrait être:
51 Gill $500 James
I ont écrit ce qui suit dans PHP pour traverser les éléments. On peut sauter la lecture de cette partie si elle est verbeuse. L'accent est mis sur l'expression de $ pour sélectionner des valeurs de noeud de texte() si elle se produit immédiatement après un élément:
$nodes = $xpath->query("//span[@id='outer']/*");
$str_out = "";
foreach($nodes as $node)
{
if($node->hasAttribute('class')
{
if($node->getAttribute('class')=="main")
$str_out .= $node->nodeValue . " ";
}
else if($node->hasAttribute('style')
{
$node_style = $node->getAttribute('style');
preg_match('~color:(.*)~', $node_style, $temp);
if($temp[1] == "red")
$str_out .= $node->nodeValue . " ";
}
// Now evaluate if the IMMEDIATELY next sibling is text()
$next_node = $xpath->query('.//following-sibling::*[1]', $node);
if($next_node->length)
{
$next_node = $next_node->item(0);
$next_node_name = $next_node->nodeName;
$next_node_value = $next_node->nodeValue;
$current_node_name = $node->nodeName;
$expression = ".//following-sibling::text()[1][preceding-sibling::".$current_node_name." and following-sibling::".$next_node_name."[contains(text(),'".$next_node_value."')]]";
$text_node = $xpath->query($expression, $node);
if($text_node->length)
{
$str_out .= $text_node->item(0)->nodeValue . " ";
}
}
}
echo $str_out;
L'objectif principal, comme mentionné précédemment, est de saisir le texte() valeurs de nœud si se produit immédiatement après un élément. Je veux écrire une expression XPATH qui fait ce qui suit: 1. Sélectionnez le premier nœud text() après un élément 2. Vérifiez si ce nœud text() se trouve entre le nœud autonome (nœud actuel) et le nœud immédiatement suivant .
Par exemple, dans ce bloc:
<span></span>James
<div style="color:red">158</div>
James est entre la portée et les noeuds div. Nous l'avons donc ajouté à la chaîne.
Mais dans ce bloc:
<span style="color:red">11</span>
<span></span>James
<div style="color:red">158</div>
déclaration James serait encore sélectionné par following-sibling [1] par rapport au premier élément span (avec la couleur: rouge)
Cela ne devrait pas être ajouté.
Veuillez voir mon expression $ dans le code PHP où j'essaye de capturer ce processus mais cela ne fonctionne pas.
$expression = ".//following-sibling::text()[1][preceding-sibling::".$current_node_name." and following-sibling::".$next_node_name."[contains(text(),'".$next_node_value."')]]";
Merci une tonne @KeithHall. Cela fonctionne parfaitement! Je ne connaissais pas la fonction node() dans following-sibling :: node() [1]. Merci encore pour la réponse rapide! –
Aussi @KeithHall, vraiment apprécier votre écriture du code, le tester et donner des explications claires pour chaque étape. –