引入nokogiri NodeSet
支持组操作。相反,保持空白在你的组匹配的,找出遗漏的物品事后:
require 'nokogiri'
doc = Nokogiri::XML <<-ENDXML
<root>
<a id="a1" class="foo">
<a id="a1a" class="foo" />
<a id="a1b" class="foo" andalso="this" />
</a>
<a id="a2" class="foo" andalso="this">
<a id="a2a" class="bar" />
<a id="a2b" class="bar" andalso="this" />
</a>
<a id="a3" class="foo" andalso="this" />
</root>
ENDXML
foos = doc.xpath('//a[@class="foo"]')
p foos.map{ |e| e['id'] }
#=> ["a1", "a1a", "a1b", "a2"]
subselect = foos.xpath('self::*[@andalso="this"]')
p subselect.map{ |e| e['id'] }
#=> ["a1b", "a2", "a3"]
missed = foos - subselect
p missed.map{ |e| e['id'] }
#=> ["a1", "a1a"]
如果你真的想在结果非节点,你将不得不使用#map
而不是#search
或其他方法引入nokogiri并获得一个Array
而不是NodeSet
:
subselect = foos.map do |el|
if el['andalso']=='this'
el
else
""
end
end
p subselect.map{ |e| e=="" ? "" : e['id'] }
#=> ["", "", "a1b", "a2", "a3"]
非常感谢您的回复,我知道您的意思。我可以将调用者“nodeset”当作一个数组并循环遍历一个一个元素来搜索xpath“规则”,但是搜索每个元素的结果是NodeSet,在遍历所有节点集之后,我有一个新的列表节点集,但最后我期望最终的结果只是一个节点集,就像Nokogiri搜索方法的返回结果一样,对于那些无法与规则匹配的节点,而不是节点集列表,即使包含匹配和不匹配的节点集也是如此。 – ywenbo 2010-12-20 00:33:38
什么是“空节点”?你几乎肯定会根据下面的答案使用'select'或'map'来创建一个数组,然后自己手动创建一个新的'NodeSet'。如果您需要此方面的帮助,请说明您真正期望在NodeSet中呈现的内容,以反映您的不匹配情况。到目前为止,您已经说过“空白字符串”和“空白节点”。 – Phrogz 2010-12-20 22:59:03
@Progrog谢谢你的回复。是的,你没事。我可以创建新的NodeSet,然后根据特定的搜索结果来填充NodeSet,这很酷。真的很感谢你的帮助。 – ywenbo 2010-12-21 01:22:51