从CSS选择器获取属性

时间:2015-04-10 13:46:00

标签: ruby-on-rails ruby xml css-selectors nokogiri

我正在尝试访问XML文档的sender属性:

<adi:ADI2 createDateTime="2015-04-10T15:36:03+02:00" docNumber="777"
  sender="test" relativePriority="1"...

使用以下命令:

xml.css('/adi|ADI2[sender]')

但它不起作用,它给出的结果完全相同:

xml.css('/adi|ADI2')

要获取属性的值,我不得不使用:

xml.css('/adi|ADI2[sender]').attribute('sender')

有没有办法直接从CSS选择器获取属性?

2 个答案:

答案 0 :(得分:2)

您在XML示例中缺少文档根目录和名称空间声明,但这是一个简单的示例:

require 'nokogiri'

doc = Nokogiri::XML('<root xmlns:adi="http://foo.com"><adi:ADI2 createDateTime="2015-04-10T15:36:03+02:00" docNumber="777" sender="test" relativePriority="1"><root>')
doc.at('adi|ADI2')['sender'] # => "test"

一旦我们有一个指向Node的指针,就可以将其视为散列。来自Node文档:

  

Nokogiri :: XML :: Node可能与属性方面的哈希类似。

irb(main):004:0> node
=> <a href="#foo" id="link">link</a>
irb(main):005:0> node['href']
=> "#foo"
irb(main):006:0> node.keys
=> ["href", "id"]
irb(main):007:0> node.values
=> ["#foo", "link"]
irb(main):008:0> node['class'] = 'green'
=> "green"
irb(main):009:0> node
=> <a href="#foo" id="link" class="green">link</a>
irb(main):010:0>

使用

的语法
xml.css('/adi|ADI2[sender]')

不正确。

/adi|ADI2[sender]尝试使用混合的CSS / XPath选择器。我建议坚持使用CSS,因为它更简单,更容易阅读,除非你需要XPath的强大功能。

此外,您可能希望使用css,而不是使用atcss返回NodeSet,除非您使用{Node进行迭代,否则无法使用[attr]语法返回找到的每个NodeSet的特定属性{1}}。如果您有该标记的多个实例,那么cssxpath或通用search将起作用,否则使用at或特定语言{{3 }}或at_css,找到第一个这样的事件。 map相当于at

Nokogiri的“at_xpath”教程涵盖了这一点。

答案 1 :(得分:1)

要获取属性,可以使用@选择器:

▶ xml = '<tag sender="test">'
#⇒ "<tag sender=\"test\">"
▶ xml = Nokogiri::XML(xml, nil, "UTF-8")
#⇒ #<Nokogiri::XML::Document:0x5ca6f16 name="document" children=...>
                 # ⇓⇓⇓⇓⇓⇓⇓ attribute
▶ xml.xpath('//tag/@sender').text
#⇒ "test"