Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 你如何计算”的数量;级别“;Nokogiri节点的后代?_Ruby_Xpath_Nokogiri - Fatal编程技术网

Ruby 你如何计算”的数量;级别“;Nokogiri节点的后代?

Ruby 你如何计算”的数量;级别“;Nokogiri节点的后代?,ruby,xpath,nokogiri,Ruby,Xpath,Nokogiri,您可以调用Nokogiri::XML::Node#祖先.size查看节点嵌套的深度。但是有没有办法确定节点中嵌套最深的子节点的嵌套深度 或者,如何找到从一个节点派生的所有叶节点 你可以打电话 Nokogiri::XML::Node#祖先.size to 查看节点嵌套的深度。但是 有没有办法确定有多深 嵌套最深嵌套的子对象 节点是什么 使用: count(ancestor::node()) 此表达式表示上下文(当前)节点在文档层次结构中拥有的取消器的数量 要找到“嵌套最深的子节点”的嵌套级别,必

您可以调用
Nokogiri::XML::Node#祖先.size
查看节点嵌套的深度。但是有没有办法确定节点中嵌套最深的子节点的嵌套深度

或者,如何找到从一个节点派生的所有叶节点

你可以打电话 Nokogiri::XML::Node#祖先.size to 查看节点嵌套的深度。但是 有没有办法确定有多深 嵌套最深嵌套的子对象 节点是什么

使用

count(ancestor::node())
此表达式表示上下文(当前)节点在文档层次结构中拥有的取消器的数量

要找到“嵌套最深的子节点”的嵌套级别,必须首先确定所有“叶”节点:

对于它们中的每一个,使用上面的XPath表达式获得它们的嵌套级别

然后必须计算最大嵌套级别(生成的所有数字的最大值),并且纯XPath 1.0不可能进行最后的计算

这可以用一个XPath 2.0表达式来表示:

max(for $leaf in /descendant-or-self::node()[not(node())],
        $depth in count($leaf/ancestor::node())
      return
        $depth
    )

下面的代码猴子补丁是为了好玩,但如果您愿意,当然可以将它们提取为单独的方法,并使用节点参数。(你的问题中只有
height
方法,但我认为
deep_leaves
方法可能很有趣。)

需要“nokogiri”
类Nokogiri::XML::Node
def深度
1.尺寸
#下面的速度慢了10倍:xpath('count(祖先::节点()))。到
结束
def树叶
xpath('./*[非(*)])。到
结束
def高度
最高=leaves.map{| leaf | leaf.depth}.max
最高的?最高深度:0
结束
迪芙叶
按高度=树叶。按{树叶{树叶.深度}分组
按高度[按高度.keys.max]
结束
结束
doc=Nokogiri::XML“
"
a1=doc.at_xpath('//a1')
p a1.高度#=>4
pa1.deep_leaves.map(&:name)#=>[“e1”、“e2”、“e3”]
pa1.leaves.map(&:name)#=>[“b1”、“d1”、“e1”、“e2”、“e3”]
编辑:要简洁地回答问题,而不必将其包装成可重复使用的部分:

p a1.xpath('.//*[not(*)]').map{ |n| n.ancestors.size }.max - a1.ancestors.size

好问题,+1。有关基于XPath 1.0的解决方案和单XPath-2.0表达式解决方案的描述,请参阅我的答案。相关信息:Nokogiri目前是否能够计算此XPath 2.0表达式?@dan我不知道Nokogiri到底是什么。如果它只是一个XPath1.0引擎,那么它本身就无法计算所需的最大值。如果Nokogiri是在特定编程语言中使用的API,那么这可以通过使用该特定编程语言编写的程序来完成,并使用Nokogiri来评估每个叶节点的嵌套级别。@dan不要被Dimitre的高代表性和令人印象深刻的XPath知识吓倒;如果他没有回答你的问题,就不要接受!:)非常感谢Dimitre的知识和帮助。顺便说一句,祝贺45k,Dimitre!:)@丹:当然,@Phrogz是对的,你可以自由地接受最好、最有用的答案。这比XPath2.0单一表达式长三倍多,复杂得多!:)这是一个很好的例子,说明了使用纯XPath解决方案优于PL,即使这恰好是Ruby。@Dimitre非常正确。(好吧……这段代码中有比相同逻辑所需的更多的内容,但这不是重点。)当libxml2/Nokogiri支持XPath2.0表达式时,这将非常好。正如OP所问的那样,你出色、简洁、正确的回答恰好不适用于Nokogiri;根据我的编辑,在几乎没有高尔夫的情况下,Ruby代码比XPath2.0少1/3字节。shrugMuch更好——在第二次尝试中——如果程序员(甚至像您这样的程序员)在第一次尝试中没有达到这种简洁性,那么他们应该真正使用XPath表达式。对于我们XSLT/XPath的人来说,这是一种解脱,因为他们不需要依靠其他需要非自然思维的PLs来实现某种程度上与XPath的自然特性相似的特性。
p a1.xpath('.//*[not(*)]').map{ |n| n.ancestors.size }.max - a1.ancestors.size