从 CSS 选择器中获取属性

Get the attribute from CSS selector

我正在尝试访问 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 选择器获取属性?

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

▶ 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"

您在 XML 示例中缺少文档根目录和名称-space 声明,但这里有一个简单的操作示例:

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, it can be treated much like a hash. From the Node 文档的指针:

A Nokogiri::XML::Node may be treated similarly to a hash with regard to attributes.

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, you might want to use at. css returns a NodeSet, and you can't return the specific attribute of every Node found using the [attr] syntax unless you iterate over the NodeSet using map. If you'll have multiple instances of that tag, then css, xpath or the generic search will work, otherwise use at, or the language-specific at_css or at_xpath 来查找第一个这样的事件。 at 等同于 search('...').first.

Nokogiri 的“Searching an HTML / XML Document”教程涵盖了这一点。