gpt4 book ai didi

ruby - 查找名称与模式匹配的元素

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:37 25 4
gpt4 key购买 nike

我正在尝试从下面的 xml 中获取一些节点。

<SalesStart Value="1412899200">10.10.2014</SalesStart>
<SalesEnd Value="4102358400">31.12.2099</SalesEnd>
<Price Value="4.9900">4,99</Price>
<SalesStartEst Value="1411516800">24.09.2014</SalesStartEst>
<SalesEndEst Value="1697500800">17.10.2023</SalesEndEst>

我可以访问像 doc.text_at('SalesStart') 这样的节点。是否可以使用类似正则表达式的方式访问节点

doc.text_at('Sales'[/Start/]) or doc.css('Sales'[/Start/])

这样我就可以在单个查询中获得 2 个节点**(SalesStart 和 SalesStartEst)**??

最佳答案

cannot use a generic regular expression in Nokogiri本身 — 因为它依赖于仅支持 XPath 1.0 的 libxml2 — 但在您的情况下,您只需要名称以 SalesStart 开头的元素。这在 XPath 1.0 中使用 starts-with() 函数是可能的:

# Find all elements, ensuring the correct prefix on the name
doc.xpath("//*[starts-with(name(),'SalesStart')]")

演示:

require 'nokogiri'
doc = Nokogiri.XML '
<r>
<SalesStart Value="1412899200">10.10.2014</SalesStart>
<SalesEnd Value="4102358400">31.12.2099</SalesEnd>
<Price Value="4.9900">4,99</Price>
<SalesStartEst Value="1411516800">24.09.2014</SalesStartEst>
<SalesEndEst Value="1697500800">17.10.2023</SalesEndEst>
</r>
'

starts = doc.xpath("//*[starts-with(name(),'SalesStart')]").map(&:text)
p starts #=> ["10.10.2014", "24.09.2014"]

但是,如果您确实需要正则表达式,那么您可以使用 Nokogiri 过度查找元素,然后使用 Ruby 来缩减集合。例如:

# memory-heavy approach; pulls all elements and then pares them down
starts = doc.xpath('//*').select{ |e| e.name =~ /^SalesStart/ }

# lightweight approach, accessing one node at a time
starts = []
doc.traverse do |node|
starts<<node if node.element? && node.name =~ /^SalesStart/
end
p starts.map(&:text) #=> ["10.10.2014", "24.09.2014"]

你甚至可以把它包装成一个方便的方法:

# monkeypatching time!
class Nokogiri::XML::Node
def elements_with_name_matching( regex )
[].tap{ |result| traverse{ |n| result<<n if n.element? && n.name=~regex } }
end
end

p doc.elements_with_name_matching( /^SalesStart/ ).map(&:text)
#=> ["10.10.2014", "24.09.2014"]

关于ruby - 查找名称与模式匹配的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28105929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com