从 CSS 选择器获取属性



>我正在尝试访问 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 示例中缺少文档根目录和命名空间声明,但下面是一个操作的简单示例:

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"

一旦我们有了指向节点的指针,就可以将其视为哈希。从节点文档:

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的强大功能。

此外,您可能希望使用at而不是使用csscss返回一个 NodeSet,并且您无法返回使用[attr]语法找到的每个节点的特定属性,除非您使用map循环访问 NodeSet。如果您有该标记的多个实例,则cssxpath或通用search将起作用,否则请使用at或特定于语言的at_cssat_xpath来查找第一个此类实例。at相当于search('...').first

Nokogiri的"搜索HTML/XML文档"教程涵盖了这一点。

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

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

相关内容

  • 没有找到相关文章

最新更新