Nokogiri::XML::Node methods examples

I faced too many obstructions to understand the
Nokogiri::XML::Node#methods.Thus I shared some of my practice
examples,so that future people don’t need to fall in same trouble.

#=================================================================================
#Here I will discuss several Nokogiri::XML::Node#methods as in the
documentation
#=================================================================================

#===================================================================================

Day - I :

Methods wil be covered:

#keys,#values,#content=,#set_attribute,#attributes,#content,#delete

#===================================================================================

require “nokogiri”

doc = Nokogiri::XML(‘’, nil, ‘EUC-JP’)
node = Nokogiri::XML::Node.new(‘a’,doc) # =>
#<Nokogiri::XML::Element:0x41c8dac name=“a”>

node.content = “click here”
node.class # => Nokogiri::XML::Element

att = {‘href’ => “www.example.com”,“id”=>1425,:class => “dummy”}
att.each {|k,v| node.set_attribute(k,v)}
node.keys # => [“href”, “id”, “class”]
node.values # => [“www.example.com”, “1425”, “dummy”]

node.attributes

=> {“href”=>#(Attr:0x41c026a { name = “href”, value =

www.example.com” }),

“id”=>#(Attr:0x41c01c0 { name = “id”, value = “1425” }),

“class”=>#(Attr:0x41c01b6 { name = “class”, value = “dummy” })}

node.attributes.map{|k,v| [k,v.class,v.content]}

=> [[“href”, Nokogiri::XML::Attr, “www.example.com”],

[“id”, Nokogiri::XML::Attr, “1425”],

[“class”, Nokogiri::XML::Attr, “dummy”]]

Hash[node.keys.zip(node.values)]

=> {“href”=>“www.example.com”, “id”=>“1425”, “class”=>“dummy”}

node.content # => “click here”
node.delete “class” # => #<Nokogiri::XML::Attr:0x41c01b6 name=“class”
value=“dummy”>
node.delete(“class”).class # => NilClass

node.attributes

=> {“href”=>#(Attr:0x41c026a { name = “href”, value =

www.example.com” }),

“id”=>#(Attr:0x41c01c0 { name = “id”, value = “1425” })}

#===================================================================================

Day - II :

Methods wil be covered:

#to_s,#to_str,#text,#text?

#===================================================================================

doc = Nokogiri::XML(‘’, nil, ‘EUC-JP’)

node = Nokogiri::XML::Node.new(‘a’,doc) # =>
#<Nokogiri::XML::Element:0x41d09bc name=“a”>
node.content = “click here”
node.to_str # => “click here”
node.to_s # => “click here
node.text # => “click here”
node.children # => [#<Nokogiri::XML::Text:0x41aa69a “click here”>]
node.children.class # => Nokogiri::XML::NodeSet
node.children.map(&:text?) # => [true]
node.children.map(&:class) # => [Nokogiri::XML::Text]

node = Nokogiri::XML::Node.new(‘title’,doc)
node.content = “survey page”
node.to_str # => “survey page”
node.to_s # => “survey page”
node.text # => “survey page”
node.children # => [#<Nokogiri::XML::Text:0x4180ae8 “survey page”>]
node.children.class # => Nokogiri::XML::NodeSet
node.children.map(&:class) # => [Nokogiri::XML::Text]

#===================================================================================

Day - III :

Methods wil be covered:

#next,#next_element,#next_sibling,#node_name,#node_name[],#node_type,#

parent

# parent=

#===================================================================================

require ‘nokogiri’

doc = Nokogiri::XML(<<-eohl)

7052
PADINI

1.2
1.1
10.0
3000000L


1.3
1.2
11.0
5000000L


eohl
doc

=> #(Document:0x417f634 {

name = “document”,

children = [

#(Element:0x417b570 {

name = “Stock”,

children = [

#(Text "\n "),

#(Element:0x4179a72 {

name = “Code”,

children = [ #(Text “7052”)]

}),

#(Text "\n "),

#(Element:0x41786cc {

name = “Name”,

children = [ #(Text “PADINI”)]

}),

#(Text "\n "),

#(Element:0x4175d00 {

name = “StockDailyRecords”,

children = [

#(Text "\n "),

#(Element:0x41752c4 {

name = “PriceOpen”,

children = [ #(Text “1.2”)]

}),

#(Text "\n "),

#(Element:0x417434c {

name = “PriceChange”,

children = [ #(Text “1.1”)]

}),

#(Text "\n "),

#(Element:0x4170fee {

name = “PriceClose”,

children = [ #(Text “10.0”)]

}),

#(Text "\n "),

#(Element:0x41702b0 {

name = “Volume”,

children = [ #(Text “3000000L”)]

}),

#(Text "\n ")]

}),

#(Text "\n "),

#(Element:0x416a5b8 {

name = “StockDailyRecords”,

children = [

#(Text "\n "),

#(Element:0x4158ec6 {

name = “PriceOpen”,

children = [ #(Text “1.3”)]

}),

#(Text "\n "),

#(Element:0x414dddc {

name = “PriceChange”,

children = [ #(Text “1.2”)]

}),

#(Text "\n "),

#(Element:0x415e812 {

name = “PriceClose”,

children = [ #(Text “11.0”)]

}),

#(Text "\n "),

#(Element:0x40dfaa8 {

name = “Volume”,

children = [ #(Text “5000000L”)]

}),

#(Text "\n ")]

}),

#(Text “\n”)]

})]

})

doc.class # => Nokogiri::XML::Document

doc.css(“StockDailyRecords”).count # => 2
doc.css(“StockDailyRecords”).class # => Nokogiri::XML::NodeSet
doc.css(“StockDailyRecords”).map(&:next)

=> [#(Text "\n "), #(Text “\n”)]

doc.css(“StockDailyRecords”).map(&:name)

=> [“StockDailyRecords”, “StockDailyRecords”]

doc.css(“StockDailyRecords”).map(&:next_element)

=> [#(Element:0x416a5b8 {

name = “StockDailyRecords”,

children = [

#(Text "\n "),

#(Element:0x4158ec6 {

name = “PriceOpen”,

children = [ #(Text “1.3”)]

}),

#(Text "\n "),

#(Element:0x414dddc {

name = “PriceChange”,

children = [ #(Text “1.2”)]

}),

#(Text "\n "),

#(Element:0x415e812 {

name = “PriceClose”,

children = [ #(Text “11.0”)]

}),

#(Text "\n "),

#(Element:0x40dfaa8 {

name = “Volume”,

children = [ #(Text “5000000L”)]

}),

#(Text "\n ")]

}),

nil]

doc.at_css(“StockDailyRecords”).children.map{|el| el.text.strip unless
el.text? }.compact

=> [“1.2”, “1.1”, “10.0”, “3000000L”]

doc.at_css(“StockDailyRecords”).children.map{|el| el.text.strip if
el.text.strip != “” }.compact

=> [“1.2”, “1.1”, “10.0”, “3000000L”]

doc.at_css(“StockDailyRecords”).next_sibling # =>
#<Nokogiri::XML::Text:0x416a9fa "\n ">
doc.at_css(“StockDailyRecords”).next_sibling.node_name # => “text”

Hash[doc.at_css(“StockDailyRecords”).children.map {|n|
[n.name,n.node_type]}]

=> {“text”=>3,

“PriceOpen”=>1,

“PriceChange”=>1,

“PriceClose”=>1,

“Volume”=>1}

Hash[doc.css(“StockDailyRecords”).map {|n| [n.name,n.node_type]}]

=> {“StockDailyRecords”=>1}

doc.at_css(“StockDailyRecords”).children.map {|n|
[n.parent.name,n.name]}

=> [[“StockDailyRecords”, “text”],

[“StockDailyRecords”, “PriceOpen”],

[“StockDailyRecords”, “text”],

[“StockDailyRecords”, “PriceChange”],

[“StockDailyRecords”, “text”],

[“StockDailyRecords”, “PriceClose”],

[“StockDailyRecords”, “text”],

[“StockDailyRecords”, “Volume”],

[“StockDailyRecords”, “text”]]

doc.at_css(“StockDailyRecords”).children.count

=> 9

doc.root.name # => “Stock”
doc.root.children.map(&:name)

=> [“text”,

“Code”,

“text”,

“Name”,

“text”,

“StockDailyRecords”,

“text”,

“StockDailyRecords”,

“text”]

doc.root.children.map{|n| n.name if n.elem? }.compact

=> [“Code”, “Name”, “StockDailyRecords”, “StockDailyRecords”]

doc.root.children.map{|n| n.name if n.elem? && !n.children.empty?
}.compact

=> [“Code”, “Name”, “StockDailyRecords”, “StockDailyRecords”]

#===================================================================================

Day - IV :

Methods wil be covered:

#path,#previous,#previous_element,#pointer_id,#line,#xml?

#===================================================================================

doc = Nokogiri::XML(<<-eohl)

7052
PADINI

1.2
1.1
10.0
3000000L


1.3
1.2
11.0
5000000L


eohl

doc.at_css(‘StockDailyRecords’).path

=> “/Stock/StockDailyRecords[1]”

doc.at_css(‘StockDailyRecords’).pointer_id

=> 139602384

doc.at_css(‘StockDailyRecords’).previous.previous

=> #(Element:0x40dd190 { name = “Name”, children = [ #(Text “PADINI”)]

})
doc.at_css(‘StockDailyRecords’).previous_element

=> #(Element:0x40dd190 { name = “Name”, children = [ #(Text “PADINI”)]

})
doc.at_css(‘StockDailyRecords’).children[1].path

=> “/Stock/StockDailyRecords[1]/PriceOpen”

doc.at_css(‘StockDailyRecords’).previous_sibling.previous_sibling

=> #(Element:0x40dd190 { name = “Name”, children = [ #(Text “PADINI”)]

})
doc.at_css(‘StockDailyRecords’).line

=> 4

doc.css(‘StockDailyRecords’).map(&:line)

=> [4, 10]

doc.xml? # => true
#===================================================================================

Day - V :

Methods wil be covered:

#replace,#unlink,#remove

#===================================================================================

doc = Nokogiri::HTML(<<-eohl)

Test 1
Test 2
foo
eohl

doc.search(‘div’).children.map(&:name)

=> [“text”, “dt”, “text”, “dd”, “text”, “dt”, “text”, “dd”, “text”]

doc.at(‘dt’).unlink
doc.search(‘div’).children.map(&:name)

=> [“text”, “text”, “dd”, “text”, “dt”, “text”, “dd”, “text”]

node = Nokogiri::XML::Node.new(‘p’,doc)

=> #(Element:0x4d5f3c8 { name = “p” })

doc.at(‘dt’).replace node
doc.search(‘div’).children.map(&:name)

=> [“text”, “text”, “dd”, “text”, “p”, “text”, “dd”, “text”]

#===================================================================================

Day - VI :

Methods wil be covered:

#matches?,#css_path,#swap

#===================================================================================

doc = Nokogiri::HTML(<<-eohl)

Test 1
Test 2
foo
eohl

doc.search(“dt,dd”).map{|n| n.name unless n.to_str.strip.empty?
}.compact

=> [“dt”, “dt”, “dd”]

doc.search(“dt,dd”).map{|n| n.css_path }

=> [“html > body > div > dt:nth-of-type(1)”,

“html > body > div > dt:nth-of-type(2)”,

“html > body > div > dd:nth-of-type(1)”,

“html > body > div > dd:nth-of-type(2)”]

doc.search(“dt,dd”).first.matches? “dt:nth-of-type(1)”

=> true

f = Nokogiri::XML.fragment( “

” )

f.css( ‘div’ ).each do | node |
node.swap( ‘

hi

’ )
end

f

=> #(DocumentFragment:0x43aa42c {

name = “#document-fragment”,

children = [

#(Element:0x43a3992 { name = “h1”, children = [ #(Text “hi”)]

})]

})

#===================================================================================

Day - VII :

Methods wil be covered:

#traverse

#===================================================================================

doc = Nokogiri::HTML(<<-eofl)

eofl

a = []
doc.at(‘div#a’).traverse do |i|
a << i.text.strip unless i.elem?
end
a.reject(&:empty?) # => [“link a1”, “link a2”, “link a3”]

doc.at(‘div#a’).traverse do |i|
p i.text unless i.elem?
end

>> "\n "

>> " link a1 "

>> "\n "

>> " link a2 "

>> "\n "

>> " link a3 "

>> "\n "

#===================================================================================

Day - VIII :

Methods wil be covered:

#traverse,#before,#after,#add_previous_sibling,#add_next_sibling,#inner_html,#inner_text,#internal_subset
#===================================================================================

doc = Nokogiri::HTML(<<-eofl)

eofl

doc.at(‘div#a’).inner_html

=> "\n link a1 \n link a2 \n link a3

\n "
doc.at(‘div#a’).inner_text

=> "\n link a1 \n link a2 \n link a3 \n "

doc.at(‘div#a’).internal_subset

=> #(DTD:0x43efa5e { name = “html” })

doc = Nokogiri::HTML::Document.new
doc # => #<Nokogiri::HTML::Document:0x48d2e40 name=“document”
children=[#<Nokogiri::XML::DTD:0x48d2c88 name=“html”>]>
pnode = Nokogiri::XML::Node.new(“div”,doc)
pnode # => #<Nokogiri::XML::Element:0x48d29a4 name=“div”>
cnode = pnode.add_child(“

Welcome

”)
pnode

=> #(Element:0x48d29a4 {

name = “div”,

children = [

#(Element:0x48d26c0 {

name = “p”,

children = [ #(Text " Welcome ")]

})]

})

#cnode.add_next_sibling(“

Please come in!

”)
cnode.class

=> Nokogiri::XML::NodeSet

cnode

=> [#<Nokogiri::XML::Element:0x48d26c0 name=“p”

children=[#<Nokogiri::XML::Text:0x48858fc " Welcome ">]>]
cnode[0]

=> #(Element:0x48d26c0 { name = “p”, children = [ #(Text " Welcome ")]

})
pnode << cnode[0].add_next_sibling(“

Please come in!

”)
pnode

=> #(Element:0x48d29a4 {

name = “div”,

children = [

#(Element:0x48d26c0 {

name = “p”,

children = [ #(Text " Welcome ")]

}),

#(Element:0x4873350 {

name = “p”,

children = [ #(Text " Please come in! ")]

})]

})

pnode.children.count

=> 2

pnode.children[1].add_previous_sibling("

Good morning!!Dear Arjun

") pnode # => #(Element:0x48d29a4 { # name = "div", # children = [ # #(Element:0x48d26c0 { # name = "p", # children = [ #(Text " Welcome ")] # }), # #(Element:0x48700c4 { # name = "p", # children = [ #(Text " Good morning!!Dear Arjun ")] # }), # #(Element:0x4873350 { # name = "p", # children = [ #(Text " Please come in! ")] # })] # }) pnode.children.count # => 3

pnode.fragment(“

  • Foo
  • bar >/li>”)

    => #(DocumentFragment:0x48e73a4 {

    name = “#document-fragment”,

    children = [

    #(Element:0x48e72f0 { name = “li”, children = [ #(Text " Foo

    ")] }),

    #(Text " "),

    #(Element:0x48e726e {

    name = “li”,

    children = [ #(Text " bar >/li>")]

    })]

    })

    pnode.class # => Nokogiri::XML::Element
    pnode.child.after(“

  • Foo
  • bar >/li>”)

    => #(Element:0x48d26c0 { name = “p”, children = [ #(Text " Welcome ")]

    })
    pnode

    => #(Element:0x48d29a4 {

    name = “div”,

    children = [

    #(Element:0x48d26c0 {

    name = “p”,

    children = [ #(Text " Welcome ")]

    }),

    #(Element:0x48db180 { name = “li”, children = [ #(Text " Foo

    ")] }),

    #(Text " "),

    #(Element:0x48db086 {

    name = “li”,

    children = [ #(Text " bar >/li>")]

    }),

    #(Element:0x48700c4 {

    name = “p”,

    children = [ #(Text " Good morning!!Dear Arjun ")]

    }),

    #(Element:0x4873350 {

    name = “p”,

    children = [ #(Text " Please come in! ")]

    })]

    })

    pnode.child.before(“

  • Foo
  • bar >/li>”)

    => #(Element:0x48d26c0 { name = “p”, children = [ #(Text " Welcome ")]

    })
    pnode

    => #(Element:0x48d29a4 {

    name = “div”,

    children = [

    #(Element:0x48a8e2e { name = “li”, children = [ #(Text " Foo

    ")] }),

    #(Text " "),

    #(Element:0x48a8c26 {

    name = “li”,

    children = [ #(Text " bar >/li>")]

    }),

    #(Element:0x48d26c0 {

    name = “p”,

    children = [ #(Text " Welcome ")]

    }),

    #(Element:0x48db180 { name = “li”, children = [ #(Text " Foo

    ")] }),

    #(Text " "),

    #(Element:0x48db086 {

    name = “li”,

    children = [ #(Text " bar >/li>")]

    }),

    #(Element:0x48700c4 {

    name = “p”,

    children = [ #(Text " Good morning!!Dear Arjun ")]

    }),

    #(Element:0x4873350 {

    name = “p”,

    children = [ #(Text " Please come in! ")]

    })]

    })

  • #===================================================================================

    Day - IX :

    Methods wil be covered:

    #ancestors

    #===================================================================================
    doc = Nokogiri::HTML(<<-eof)

    OTHER SERVICES

    USEFUL LINKS

    eof

    doc.class # => Nokogiri::HTML::Document
    doc.at(‘ul.type-a’).class # => Nokogiri::XML::Element
    doc.at(‘ul.type-a’).children.reject{|i| i.text.strip == “”}.map(&:text)

    => [“Complaints”,

    “Online Shopping”,

    “Foreign Travel/EZ-Pay/Gift Cards”,

    “Mobile Banking Services”,

    “NRI Services”,

    “OnlineSBI Global”,

    “SBI Express Remit”,

    “e-DFS/e-VFS”,

    “SBI F.A.S.T.”,

    “Secure Card Transactions”,

    “Net Banking for Visually Challenged”,

    “SBI e-File”]

    doc.at(‘ul.type-a’).children.reject{|i| i.text.strip ==
    “”}[2].ancestors.map(&:name)

    => [“ul”, “body”, “html”, “document”]

    #===================================================================================

    Day - X :

    Methods wil be covered:

    #dup,#clone

    #===================================================================================
    dom = Nokogiri.XML <<-XML_DOC


    foo

    bar

    bat




    XML_DOC

    dom.search(‘c n’).count # => 3
    dom.search(‘c n’).map(&:text) # => [“foo”, “bar”, “bat”]
    #shallow copy
    dom.search(‘c n’).first.dup(0) # => #<Nokogiri::XML::Element:0x4679522
    name=“n”>
    dom.search(‘c n’).first.clone(0) # => #<Nokogiri::XML::Element:0x467919e
    name=“n”>
    #deep copy
    dom.search(‘c n’).first.dup(1) # => #<Nokogiri::XML::Element:0x4678d0c
    name=“n” children=[#<Nokogiri::XML::Text:0x46789f6 “foo”>]>
    dom.search(‘c n’).first.clone(1) # => #<Nokogiri::XML::Element:0x4678690
    name=“n” children=[#<Nokogiri::XML::Text:0x4674522 “foo”>]>
    dom.search(‘c n’).first.dup # => #<Nokogiri::XML::Element:0x467404a
    name=“n” children=[#<Nokogiri::XML::Text:0x466ddd0 “foo”>]>