removing nodes from Nokogiri::XML::NodeSet

T

Ted Flethuseo

Hi everyone,

I am having trouble removing a node from a Nokogiri::XML::NodeSet, not
sure what
I should use to remove a specific node at a given position.

I have tried the following but it doesn't seem to work:

puts nodes.length
nodes[0].remove
puts nodes.length


Ted
 
M

Mike Dalessio

[Note: parts of this message were removed to make it a legal post.]

Greetings,

Hi everyone,

I am having trouble removing a node from a Nokogiri::XML::NodeSet, not
sure what
I should use to remove a specific node at a given position.

Nokogiri's NodeSet implements Enumerable, and much of the Array interface,
so you should be able to treat it much like you'd treat any Ruby Array.

For example, to remove the first node in a NodeSet, simply use
`nodes.shift`. To remove the last node, use `nodes.pop`. Etc.

I have tried the following but it doesn't seem to work:

puts nodes.length
nodes[0].remove

Just a note, that the above code removes the first node in the NodeSet from
its document. Not what you want.

Best of luck.
 
T

Ted Flethuseo

It doesn't remove it though. I also don't want specifically to remove
the first or last node, often I want to remove one somewhere in the
middle of the array.

puts nodes.length
nodes[0].remove
puts nodes.length

when I run that code I have originally 4 nodes, and after, I still have
4 nodes. I found a way to do this but I disklike it, because it has to
search for the node every time it needs to erase it.

puts nodes.length
nodes.delete(nodes[0])
puts nodes.length

Ted


Mike Dalessio wrote in post #992653:
Greetings,

Hi everyone,

I am having trouble removing a node from a Nokogiri::XML::NodeSet, not
sure what
I should use to remove a specific node at a given position.

Nokogiri's NodeSet implements Enumerable, and much of the Array
interface,
so you should be able to treat it much like you'd treat any Ruby Array.

For example, to remove the first node in a NodeSet, simply use
`nodes.shift`. To remove the last node, use `nodes.pop`. Etc.

I have tried the following but it doesn't seem to work:

puts nodes.length
nodes[0].remove

Just a note, that the above code removes the first node in the NodeSet
from
its document. Not what you want.

Best of luck.
 
R

Robert Klemme

It doesn't remove it though. I also don't want specifically to remove
the first or last node, often I want to remove one somewhere in the
middle of the array.

puts nodes.length
nodes[0].remove
puts nodes.length

when I run that code I have originally 4 nodes, and after, I still have
4 nodes. I found a way to do this but I disklike it, because it has to
search for the node every time it needs to erase it.

puts nodes.length
nodes.delete(nodes[0])
puts nodes.length

You want method #remove:

irb(main):006:0> doc =
Nokogiri::XML("<root><test>1</test><test>2</test></root>")
=> #<Nokogiri::XML::Document:0x832a9b2 name="document"
children=[#<Nokogiri::XML::Element:0x832a728 name="root"
children=[#<Nokogiri::XML::Element:0x8328c20 name="test"
children=[#<Nokogiri::XML::Text:0x8328a9a "1">]>,
#<Nokogiri::XML::Element:0x8328914 name="test"
children=[#<Nokogiri::XML::Text:0x832878e "2">]>]>]>
irb(main):007:0> puts doc
<?xml version="1.0"?>
<root>
<test>1</test>
<test>2</test>
</root>
=> nil
irb(main):008:0> doc.xpath('//test')
=> [#<Nokogiri::XML::Element:0x8328c20 name="test"
children=[#<Nokogiri::XML::Text:0x8328a9a "1">]>,
#<Nokogiri::XML::Element:0x8328914 name="test"
children=[#<Nokogiri::XML::Text:0x832878e "2">]>]
irb(main):009:0> doc.xpath('//test[last()]')
=> [#<Nokogiri::XML::Element:0x8328914 name="test"
children=[#<Nokogiri::XML::Text:0x832878e "2">]>]
irb(main):010:0> doc.xpath('//test[last()]').remove
=> [#<Nokogiri::XML::Element:0x8328914 name="test"
children=[#<Nokogiri::XML::Text:0x832878e "2">]>]
irb(main):011:0> puts doc
<?xml version="1.0"?>
<root>
<test>1</test>
</root>
=> nil

Kind regards

robert
 
7

7stud --

Ted Flethuseo wrote in post #992628:
Hi everyone,

I am having trouble removing a node from a Nokogiri::XML::NodeSet, not
sure what
I should use to remove a specific node at a given position.

I have tried the following but it doesn't seem to work:

puts nodes.length
nodes[0].remove
puts nodes.length


Ted

Consider this example:


str = "hello \n world"
arr = str.split " "
p arr

--output:--
["hello", "world"]

str.delete!(arr[0])
puts str
puts arr.length
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,011
Latest member
AjaUqq1950

Latest Threads

Top