无法使用 Nokogiri 从 XML 文档中检索 Google 命名空间中的数据
Can't retrieve data in Google namespace from XML document with Nokogiri
我有这个 Google 购物提要:
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<item>
<title>test</title>
<g:id>1</g:id>
<g:color>blue</g:color>
</item>
<item>
<title>test2</title>
<g:id>2</g:id>
<g:color>red</g:color>
</item>
</channel></rss>
我已经搜索了好几天了,似乎找不到答案。我还研究了 Nokogiri 文档,但这也没有解决任何问题。
我想做什么:
doc = Nokogiri::XML(*Google Shopping Feed*)
doc.css('channel > item').each do |item|
puts item.css('g:id')
end
但这returns没什么。我尝试了很多建议,但 none 似乎有效。显然我在这里错过了一些东西,但我不知道是什么。
我无法弄清楚的另一件事是检索项目中所有属性的列表。所以我的问题是如何从 Google 购物提要中检索以下数组:
# attributes => ['title', 'g:id', 'g:color']
如果您想保留命名空间信息,最简单的解决方案可能是使用 Xpath 表达式。
类似于
doc.xpath('//item').each_with_index do |node, i|
puts "Element #{i} attributes:"
node.xpath("*/text()").each do |element|
puts "#{element.name}: #{element.text}"
end
end
尝试将 at_xpath
与 text
一起使用:
doc.css('channel > item').each do |item|
puts item.at_xpath('g:id').text
end
#=> 1
#=> 2
Another thing that I can't figure out is retrieving a list of all
attributes in an item.
您可以获得每个 item
的数组,如下所示:
doc.css('channel > item').map do |item|
item.element_children.map do |key|
prefix = "#{key.namespace.prefix}:" if key.namespace
name = key.name
"#{prefix}#{name}"
end
end
#=> [["title", "g:id", "g:color"], ["title", "g:id", "g:color"]]
如果所有项目都具有完全相同的属性,那么您可以只使用第一个元素(而不是迭代所有元素):
doc.css('channel > item').first.element_children.map do |key|
prefix = "#{key.namespace.prefix}:" if key.namespace
name = key.name
"#{prefix}#{name}"
end
#=> ["title", "g:id", "g:color"]
我有这个 Google 购物提要:
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<item>
<title>test</title>
<g:id>1</g:id>
<g:color>blue</g:color>
</item>
<item>
<title>test2</title>
<g:id>2</g:id>
<g:color>red</g:color>
</item>
</channel></rss>
我已经搜索了好几天了,似乎找不到答案。我还研究了 Nokogiri 文档,但这也没有解决任何问题。
我想做什么:
doc = Nokogiri::XML(*Google Shopping Feed*)
doc.css('channel > item').each do |item|
puts item.css('g:id')
end
但这returns没什么。我尝试了很多建议,但 none 似乎有效。显然我在这里错过了一些东西,但我不知道是什么。
我无法弄清楚的另一件事是检索项目中所有属性的列表。所以我的问题是如何从 Google 购物提要中检索以下数组:
# attributes => ['title', 'g:id', 'g:color']
如果您想保留命名空间信息,最简单的解决方案可能是使用 Xpath 表达式。
类似于
doc.xpath('//item').each_with_index do |node, i|
puts "Element #{i} attributes:"
node.xpath("*/text()").each do |element|
puts "#{element.name}: #{element.text}"
end
end
尝试将 at_xpath
与 text
一起使用:
doc.css('channel > item').each do |item|
puts item.at_xpath('g:id').text
end
#=> 1
#=> 2
Another thing that I can't figure out is retrieving a list of all attributes in an item.
您可以获得每个 item
的数组,如下所示:
doc.css('channel > item').map do |item|
item.element_children.map do |key|
prefix = "#{key.namespace.prefix}:" if key.namespace
name = key.name
"#{prefix}#{name}"
end
end
#=> [["title", "g:id", "g:color"], ["title", "g:id", "g:color"]]
如果所有项目都具有完全相同的属性,那么您可以只使用第一个元素(而不是迭代所有元素):
doc.css('channel > item').first.element_children.map do |key|
prefix = "#{key.namespace.prefix}:" if key.namespace
name = key.name
"#{prefix}#{name}"
end
#=> ["title", "g:id", "g:color"]