首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Nokogiri访问属性

如何使用Nokogiri访问属性
EN

Stack Overflow用户
提问于 2010-05-25 08:22:57
回答 2查看 61.8K关注 0票数 57

我有一个简单的任务来访问一些属性的值。这是一个简单的脚本,它使用Nokogiri::XML::Builder创建一个简单的XML文档。

代码语言:javascript
复制
require 'nokogiri'

builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
  xml.Placement(:messageId => "392847-039820-938777", :system => "MOD", :version => "2.0") {
    xml.objects {
        xml.object(:myattribute => "99", :anotherattrib => "333")
        xml.nextobject_ '9387toot'
        xml.Entertainment "Last Man Standing"
    }
  }
end

puts builder.to_xml
puts builder.root.attributes["messageId"]

结果是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Placement messageId="392847-039820-938777" version="2.0" system="MOD">
  <objects>
    <object anotherattrib="333" myattribute="99"/>
    <nextobject>9387toot</nextobject>
    <Entertainment>Last Man Standing</Entertainment>
  </objects>
</Placement>
C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/document.rb:178:in `add_child': Document already has a root node (RuntimeError)
    from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/node.rb:455:in `parent='
    from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/builder.rb:358:in `insert'
    from C:/Ruby/lib/ruby/gems/1.8/gems/nokogiri-1.4.2-x86-mingw32/lib/nokogiri/xml/builder.rb:350:in `method_missing'
    from C:/Documents and Settings/etrojan/workspace/Lads/tryXPATH2.rb:15

生成的XML看起来没问题。但是,我尝试访问属性会导致生成一个错误:

代码语言:javascript
复制
Document already has a root node

我不明白为什么puts会导致这个错误。

EN

回答 2

Stack Overflow用户

发布于 2010-05-26 17:35:13

对于您的示例,使用Nokogiri::XML::Reader是可行的,但可能不是您正在寻找的完整答案(请注意,这里有no attributes method for Builder)。

代码语言:javascript
复制
reader = Nokogiri::XML::Reader(builder.to_xml)
reader.read #Moves to next node in document
reader.attribute("messageId")

请注意,如果您再次发出reader.read,然后尝试使用reader.attribute("messageId"),则结果将为nil,因为当前节点将不具有此属性。

如果想要按属性搜索Nokogiri::XML::Document文档,那么可能需要使用XML语言。

代码语言:javascript
复制
doc = Nokogiri::XML(builder.to_xml)
elems = doc.xpath("//*[@messageId]") #get all elements with an attribute of 'messageId'
elems[0].attr('messageId') #gets value of attribute of first elem 
票数 68
EN

Stack Overflow用户

发布于 2012-08-29 23:29:22

下面是一种使用Nokogiri访问属性的更简洁的方法(假设您已经将xml存储在一个名为xml的变量中,如@atomicules的答案所述):

代码语言:javascript
复制
xml.xpath("//Placement").attr("messageId")
票数 51
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2901241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档