2010-01-11 1 views
0

Возникает вопрос о повторяющихся узлах и отсутствующих значениях.Последовательность узлов с значениями опций

Учитывая, что xml ниже, есть способ в XPath возврата (value2, null, value5), а не (value2, value5)? Я использую выражение, которое выглядит так:

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

Чтобы получить значения. Мне нужно знать, что отсутствует значение, и по каким индексам это происходит. Я полный новичок в XPath и не могу понять, как это сделать.

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

С наилучшими пожеланиями,

mipper

ответ

0

Учитывая ниже XML есть способ в XPath возвращения (значение2, нулевой value5)

В XPath нет. XPath может только выбрать/вернуть существующих узлов. Он не знает null.

В XSLT или любом другом языке, поддерживающем XML, проблема может быть решена путем итерации.

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

Я подозреваю, что вам нужно, чтобы получить дружественные с XML Parser и перебирать узлы самостоятельно. Этот пример приведен в Ruby; Я украсил его комментариями, так как я не знаю, какие языки вы можете прочитать.

#!/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"]