我正在尝试访问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选择器获取属性?
答案 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
,而不是使用at
。 css
返回NodeSet,除非您使用{Node进行迭代,否则无法使用[attr]
语法返回找到的每个NodeSet的特定属性{1}}。如果您有该标记的多个实例,那么css
,xpath
或通用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"