从 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”教程涵盖了这一点。
我正在尝试访问 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”教程涵盖了这一点。