gpt4 book ai didi

ruby - xpath 挑战 : How to merge multiple results into one result

转载 作者:数据小太阳 更新时间:2023-10-29 02:31:03 26 4
gpt4 key购买 nike

我使用 Ruby 1.9.3p385 并使用 Nokogiri 来解析 XML 文件。不太确定我使用的是哪个 xpath 版本,但它确实响应 v.1 语法/函数,而不是 v.2 语法。

我有这个 XML 文件:

<root_tag>
<middle_tag>
<item_tag>
<headline_1>
<tag_1>Product title 1</tag_1>
</headline_1>
<headline_2>
<tag_2>Product attribute 1</tag_2>
</headline_2>
</item_tag>
<item_tag>
<headline_1>
<tag_1>Product title 2</tag_1>
</headline_1>
<headline_2>
<tag_2>Product attribute 2</tag_2>
</headline_2>
</item_tag>
</middle_tag>
</root_tag>

我想提取所有产品,为此我使用了这段代码:

products = xml_file.xpath("/root_tag/middle_tag/item_tag/headline_1|/root_tag/middle_tag/item_tag/headline_2")

puts products.size # => 4

如果您查看输出,使用:

products.each_with_index do |product, i|
puts "product #{i}:"
puts product
end

你明白了:

product 0:
<headline_1>
<tag_1>Product title 1</tag_1>
</headline_1>
product 1:
<headline_2>
<tag_2>Product attribute 1</tag_2>
</headline_2>
product 2:
<headline_1>
<tag_1>Product title 2</tag_1>
</headline_1>
product 3:
<headline_2>
<tag_2>Product attribute 2</tag_2>
</headline_2>

我需要我的代码来加入/合并所有匹配到相同的结果(所以 products.size 应该是 2)。最终输出应如下所示:

product 0:
<headline_1>
<tag_1>Product title 1</tag_1>
</headline_1>
<headline_2>
<tag_2>Product attribute 1</tag_2>
</headline_2>
product 1:
<headline_1>
<tag_1>Product title 2</tag_1>
</headline_1>
<headline_2>
<tag_2>Product attribute 2</tag_2>
</headline_2>

我在整个互联网上都看过了,但是所有的变体,例如:

products = xml_file.xpath("/root_tag/middle_tag/item_tag/*[self::headline_1|self::headline_2]")

所有似乎都输出相同的结果。

我是否遗漏了 xpath 中的一些重要点,或者我是否忽略了什么?

最佳答案

XPath 只知道普通序列,所以没有像子序列那样的东西。您必须将每个“产品”包装到某个 XML 元素中。很高兴我们已经有了这样一个元素 ( <item_tag/> ),所以代码相当简单:

products = doc.xpath("(//item_tag")
products.each_with_index do |product, i|
puts "product #{i}:"
product.children.each do |line|
puts line
end
end

输出是(可能需要更多格式,但我不习惯使用 ruby​​,因此无法帮助您):

product 0:

<headline_1>
<tag_1>Product title 1</tag_1>
</headline_1>

<headline_2>
<tag_2>Product attribute 1</tag_2>
</headline_2>

product 1:

<headline_1>
<tag_1>Product title 2</tag_1>
</headline_1>

<headline_2>
<tag_2>Product attribute 2</tag_2>
</headline_2>

解决所有 <headline_n/> -标签,你也可以使用//*[starts-with(local-name(), 'headline')]使代码更加灵活。

关于ruby - xpath 挑战 : How to merge multiple results into one result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15717113/

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