Skip to content

Calculate the differences between two XML/HTML documents.

License

Notifications You must be signed in to change notification settings

ramlaxmanyadav/nokogiri-diff

 
 

Repository files navigation

nokogiri-diff

Description

nokogiri-diff adds the ability to calculate the differences (added or removed nodes) between two XML/HTML documents.

Features

  • Performs a breadth-first comparison between children nodes.
  • Compares XML/HTML Elements, Attributes, Text nodes and DTD nodes.
  • Allows calculating differences between documents, or just enumerating the added or removed nodes.

Examples

Enumerate over the the differences between two HTML documents:

require 'nokogiri/diff'

doc1 = Nokogiri::HTML('<div><p>one</p> two </div>')
doc2 = Nokogiri::HTML('<div><p id="1">one</p> <p>three</p></div>')

doc1.diff(doc2) do |change,node|
  puts "#{change} #{node.to_html}".ljust(30) + node.parent.path
end

#   <div>
# <p>one</p> two </div> /
#   <p>one</p>                  /div
# -  two                        /div
# +                             /div
# + <p>three</p>                /div
# +  id="1"                     /div/p[1]
#   one                         /div/p

Only find the added nodes:

doc1.diff(doc2, :added => true) do |change,node|
  puts node.to_html.ljust(30) + node.parent.path
end

#                               /div
# <p>three</p>                  /div
#  id="1"                       /div/p[1]

Only find the removed nodes:

doc1.diff(doc2, :removed => true) do |change,node|
  puts node.to_html.ljust(30) + node.parent.path
end

#  two                          /div

Using DifferenceViewer

Nokogiri::XML::Node::DifferenceViewer provide the functionality to add css classes on added and removed elements and text into the new document and returns a new document with the custom css classes.

Example

require 'nokogiri/diff'

doc1 = Nokogiri::HTML('<div><p>one</p> two </div>')
doc2 = Nokogiri::HTML('<div><p id="1">one</p> <p>three</p></div>')
result = Nokogiri::XML::Node::DifferenceViewer.new.difference_view(doc1,doc2)
# The result is a Nokogiri doc with custom classes. The classes will be
t_style_removed => for Nokogiri::XML::Text removed
e_style_removed => for Nokogiri::XML::Element removed
t_style_added => for Nokogiri::XML::Test added
e_style_added => for Nokogiri::XML::Element added

Requirements

Install

$ gem install nokogiri-diff

Copyright

Copyright (c) 2010-2012 Hal Brodigan

See {file:LICENSE.txt} for details.

About

Calculate the differences between two XML/HTML documents.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Ruby 100.0%