2010-01-11 8 views
0

Voici une question sur les nœuds répétés et les valeurs manquantes.Séquence de nœuds avec des valeurs d'options

Étant donné le xml ci-dessous, y a-t-il un moyen de retourner XPath (value2, null, value5) plutôt que (value2, value5)? J'utilise une expression qui ressemble à:

/nodes/node[*]/value2/text() 

Pour récupérer les valeurs. J'ai besoin de savoir qu'il manque une valeur et à quel index cela se produit. Je suis complètement novice avec XPath et je n'arrive pas à comprendre comment le faire.

<nodes> 
    <node> 
    <value1>value1</value1> 
    <value2>value2</value2> 
    </node> 
    <node> 
    <value1>value3</value1> 
    </node> 
    <node> 
    <value1>value4</value1> 
    <value2>value5</value2> 
    </node> 
</nodes> 

Cordialement,

Mipper

Répondre

0

Compte tenu du xml ci-dessous est-il un moyen de XPath de retour (valeur2, null, valeur5)

En XPath, non. XPath peut uniquement sélectionner/renvoyer existants nœuds. Il ne sait pas nul.

Dans XSLT ou tout autre langage de programmation compatible XML, le problème peut être résolu par itération.

<xsl:for-each select="/nodes/node"> 
    <xsl:value-of select="*[2]" /> 
    <xsl:text>, </xsl:text> 
</xsl:for-each> 
1

Je suppose que vous aurez besoin pour obtenir amical avec votre analyseur XML et itérer sur les nœuds vous-même. Cet exemple est en Ruby; Je l'ai décoré de commentaires car je ne sais pas quelles langues vous pouvez lire.

#!/usr/bin/ruby1.8 

require 'nokogiri' 

xml = <<EOS 
<nodes> 
    <node> 
    <value1>value1</value1> 
    <value2>value2</value2> 
    </node> 
    <node> 
    <value1>value3</value1> 
    </node> 
    <node> 
    <value1>value4</value1> 
    <value2>value5</value2> 
    </node> 
</nodes> 
EOS 

# Parse the xml with Nokogiri 
doc = Nokogiri::XML(xml) 

# Get an array of nodes 
nodes = doc.xpath('/nodes/node') 

# For each node, get its value. Put the collected values into the 
# "values" array. 
values = nodes.collect do |node| 
    node.at_xpath('value2/text()').to_s 
end 

# Print the values in a programmer-friendly format 
p values  # => ["value2", "", "value5"]