>我正在尝试访问 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
而不是使用css
。css
返回一个 NodeSet,并且您无法返回使用[attr]
语法找到的每个节点的特定属性,除非您使用map
循环访问 NodeSet。如果您有该标记的多个实例,则css
、xpath
或通用search
将起作用,否则请使用at
或特定于语言的at_css
或at_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"