<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -32,7 +32,7 @@ This will return an object containing information extracted from the RDF respons
 ## Requirements ##
 
 * [Ruby 1.8.5 or better](http://ruby-lang.org)
-* [libxml-ruby](http://libxml.rubyforge.org/), [libxml2](http://xmlsoft.org/)
+* [nokogiri](http://nokogiri.rubyforge.org/nokogiri/), [libxml2](http://xmlsoft.org/)
 * [curb](http://curb.rubyforge.org/), [libcurl](http://curl.haxx.se/)
 * [json](http://json.rubyforge.org/)
 </diff>
      <filename>README.markdown</filename>
    </modified>
    <modified>
      <diff>@@ -18,7 +18,7 @@ begin
     s.authors = ['Abhay Kumar']
     s.files = FileList[&quot;[A-Z]*&quot;, &quot;{bin,generators,lib,test}/**/*&quot;]
     s.rubyforge_project = 'calais'
-    s.add_dependency 'libxml-ruby', '&gt;= 0.5.4'
+    s.add_dependency 'nokogiri', '&gt;= 1.3.3'
     s.add_dependency 'json', '&gt;= 1.1.3'
     s.add_dependency 'curb', '&gt;= 0.1.4'
   end</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -41,16 +41,16 @@ Gem::Specification.new do |s|
     s.specification_version = 2
 
     if Gem::Version.new(Gem::RubyGemsVersion) &gt;= Gem::Version.new('1.2.0') then
-      s.add_runtime_dependency(%q&lt;libxml-ruby&gt;, [&quot;&gt;= 0.5.4&quot;])
+      s.add_runtime_dependency(%q&lt;nokogiri&gt;, [&quot;&gt;= 1.3.3&quot;])
       s.add_runtime_dependency(%q&lt;json&gt;, [&quot;&gt;= 1.1.3&quot;])
       s.add_runtime_dependency(%q&lt;curb&gt;, [&quot;&gt;= 0.1.4&quot;])
     else
-      s.add_dependency(%q&lt;libxml-ruby&gt;, [&quot;&gt;= 0.5.4&quot;])
+      s.add_dependency(%q&lt;nokogiri&gt;, [&quot;&gt;= 1.3.3&quot;])
       s.add_dependency(%q&lt;json&gt;, [&quot;&gt;= 1.1.3&quot;])
       s.add_dependency(%q&lt;curb&gt;, [&quot;&gt;= 0.1.4&quot;])
     end
   else
-    s.add_dependency(%q&lt;libxml-ruby&gt;, [&quot;&gt;= 0.5.4&quot;])
+    s.add_dependency(%q&lt;nokogiri&gt;, [&quot;&gt;= 1.3.3&quot;])
     s.add_dependency(%q&lt;json&gt;, [&quot;&gt;= 1.1.3&quot;])
     s.add_dependency(%q&lt;curb&gt;, [&quot;&gt;= 0.1.4&quot;])
   end</diff>
      <filename>calais.gemspec</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'iconv'
 require 'set'
 
 require 'rubygems'
-require 'xml/libxml'
+require 'nokogiri'
 require 'json'
 require 'curb'
 </diff>
      <filename>lib/calais.rb</filename>
    </modified>
    <modified>
      <diff>@@ -38,36 +38,37 @@ module Calais
 
     def params_xml
       check_params
-
-      params_node = XML::Node.new('c:params')
+      document = Nokogiri::XML::Document.new
+      
+      params_node = Nokogiri::XML::Node.new('c:params', document)
       params_node['xmlns:c'] = 'http://s.opencalais.com/1/pred/'
       params_node['xmlns:rdf'] = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
-
-      processing_node = XML::Node.new('c:processingDirectives')
+      
+      processing_node = Nokogiri::XML::Node.new('c:processingDirectives', document)
       processing_node['c:contentType'] = AVAILABLE_CONTENT_TYPES[@content_type] if @content_type
       processing_node['c:outputFormat'] = AVAILABLE_OUTPUT_FORMATS[@output_format] if @output_format
       processing_node['c:reltagBaseURL'] = @reltag_base_url.to_s if @reltag_base_url
-
+      
       processing_node['c:enableMetadataType'] = @metadata_enables.join(';') unless @metadata_enables.empty?
       processing_node['c:discardMetadata'] = @metadata_discards.join(';') unless @metadata_discards.empty?
       processing_node['c:omitOutputtingOriginalText'] = 'true' if @omit_outputting_original_text
-
-      user_node = XML::Node.new('c:userDirectives')
+      
+      user_node = Nokogiri::XML::Node.new('c:userDirectives', document)
       user_node['c:allowDistribution'] = @allow_distribution.to_s unless @allow_distribution.nil?
       user_node['c:allowSearch'] = @allow_search.to_s unless @allow_search.nil?
       user_node['c:externalID'] = @external_id.to_s if @external_id
       user_node['c:submitter'] = @submitter.to_s if @submitter
-
+      
       params_node &lt;&lt; processing_node
       params_node &lt;&lt; user_node
-
+      
       if @external_metadata
-        external_node = XML::Node.new('c:externalMetadata')
+        external_node = Nokogiri::XML::Node.new('c:externalMetadata', document)
         external_node &lt;&lt; @external_metadata
         params_node &lt;&lt; external_node
       end
-
-      params_node.to_s
+      
+      params_node.to_xml(:indent =&gt; 2)
     end
 
     private</diff>
      <filename>lib/calais/client.rb</filename>
    </modified>
    <modified>
      <diff>@@ -47,14 +47,14 @@ module Calais
     class Instance
       attr_accessor :prefix, :exact, :suffix, :offset, :length
 
-      # Makes a new Instance object from an appropriate LibXML::XML::Node.
+      # Makes a new Instance object from an appropriate Nokogiri::XML::Node.
       def self.from_node(node)
         instance = self.new
-        instance.prefix = node.find_first(&quot;c:prefix&quot;).content
-        instance.exact = node.find_first(&quot;c:exact&quot;).content
-        instance.suffix = node.find_first(&quot;c:suffix&quot;).content
-        instance.offset = node.find_first(&quot;c:offset&quot;).content.to_i
-        instance.length = node.find_first(&quot;c:length&quot;).content.to_i
+        instance.prefix = node.xpath(&quot;c:prefix[1]&quot;).first.content
+        instance.exact  = node.xpath(&quot;c:exact[1]&quot;).first.content
+        instance.suffix = node.xpath(&quot;c:suffix[1]&quot;).first.content
+        instance.offset = node.xpath(&quot;c:offset[1]&quot;).first.content.to_i
+        instance.length = node.xpath(&quot;c:length[1]&quot;).first.content.to_i
 
         instance
       end
@@ -76,112 +76,112 @@ module Calais
 
     private
       def extract_data
-        doc = XML::Parser.string(@raw_response).parse
+        doc = Nokogiri::XML(@raw_response)
 
-        if doc.root.find(&quot;/Error&quot;).first
-          raise Calais::Error, doc.root.find(&quot;/Error/Exception&quot;).first.content
+        if doc.root.xpath(&quot;/Error[1]&quot;).first
+          raise Calais::Error, doc.root.xpath(&quot;/Error/Exception&quot;).first.content
         end        
 
-        doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:docinfometa]}')]/..&quot;).each do |node|
+        doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:docinfometa]}')]/..&quot;).each do |node|
           @language = node['language']
           @submission_date =  DateTime.parse node['submissionDate']
 
-          attributes = extract_attributes(node.find(&quot;*[contains(name(), 'c:')]&quot;))
+          attributes = extract_attributes(node.xpath(&quot;*[contains(name(), 'c:')]&quot;))
 
           @signature = attributes.delete('signature')
           @submitter_code = attributes.delete('submitterCode')
 
-          node.remove!
+          node.remove
         end
 
-        doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:docinfo]}')]/..&quot;).each do |node|
+        doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:docinfo]}')]/..&quot;).each do |node|
           @request_id = node['calaisRequestID']
 
-          attributes = extract_attributes(node.find(&quot;*[contains(name(), 'c:')]&quot;))
+          attributes = extract_attributes(node.xpath(&quot;*[contains(name(), 'c:')]&quot;))
 
           @doc_title = attributes.delete('docTitle')
-          @doc_date = Date.parse attributes.delete('docDate')
+          @doc_date = Date.parse(attributes.delete('docDate')) 
 
-          node.remove!
+          node.remove
         end
 
-        @categories = doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:doccat]}')]/..&quot;).map do |node|
+        @categories = doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:doccat]}')]/..&quot;).map do |node|
           category = Category.new
-          category.name = node.find_first(&quot;c:categoryName&quot;).content
-          score = node.find_first(&quot;c:score&quot;)
+          category.name = node.xpath(&quot;c:categoryName[1]&quot;).first.content
+          score = node.xpath(&quot;c:score[1]&quot;).first
           category.score = score.content.to_f unless score.nil?
 
-          node.remove!
+          node.remove
           category
         end
 
-        @relevances = doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:relevances]}')]/..&quot;).inject({}) do |acc, node|
-          subject_hash = node.find_first(&quot;c:subject&quot;)[:resource].split('/')[-1]
-          acc[subject_hash] = node.find_first(&quot;c:relevance&quot;).content.to_f
+        @relevances = doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:relevances]}')]/..&quot;).inject({}) do |acc, node|
+          subject_hash = node.xpath(&quot;c:subject[1]&quot;).first[:resource].split('/')[-1]
+          acc[subject_hash] = node.xpath(&quot;c:relevance[1]&quot;).first.content.to_f
 
-          node.remove!
+          node.remove
           acc
         end
 
-        @entities = doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:entities]}')]/..&quot;).map do |node|
+        @entities = doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:entities]}')]/..&quot;).map do |node|
           extracted_hash = node['about'].split('/')[-1] rescue nil
 
           entity = Entity.new
           entity.calais_hash = CalaisHash.find_or_create(extracted_hash, @hashes)
           entity.type = extract_type(node)
-          entity.attributes = extract_attributes(node.find(&quot;*[contains(name(), 'c:')]&quot;))
+          entity.attributes = extract_attributes(node.xpath(&quot;*[contains(name(), 'c:')]&quot;))
 
           entity.relevance = @relevances[extracted_hash]
           entity.instances = extract_instances(doc, extracted_hash)
 
-          node.remove!
+          node.remove
           entity
         end
 
-        @relations = doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:relations]}')]/..&quot;).map do |node|
+        @relations = doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:relations]}')]/..&quot;).map do |node|
           extracted_hash = node['about'].split('/')[-1] rescue nil
 
           relation = Relation.new
           relation.calais_hash = CalaisHash.find_or_create(extracted_hash, @hashes)
           relation.type = extract_type(node)
-          relation.attributes = extract_attributes(node.find(&quot;*[contains(name(), 'c:')]&quot;))
+          relation.attributes = extract_attributes(node.xpath(&quot;*[contains(name(), 'c:')]&quot;))
           relation.instances = extract_instances(doc, extracted_hash)
 
-          node.remove!
+          node.remove
           relation
         end
 
-        @geographies = doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:geographies]}')]/..&quot;).map do |node|
-          attributes = extract_attributes(node.find(&quot;*[contains(name(), 'c:')]&quot;))
+        @geographies = doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:geographies]}')]/..&quot;).map do |node|
+          attributes = extract_attributes(node.xpath(&quot;*[contains(name(), 'c:')]&quot;))
 
           geography = Geography.new
           geography.name = attributes.delete('name')
           geography.calais_hash = attributes.delete('subject')
           geography.attributes = attributes
 
-          node.remove!
+          node.remove
           geography
         end
 
-        doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:defaultlangid]}')]/..&quot;).each { |node| node.remove! }
-        doc.root.find(&quot;./*&quot;).each { |node| node.remove! }
+        doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:defaultlangid]}')]/..&quot;).each { |node| node.remove }
+        doc.root.xpath(&quot;./*&quot;).each { |node| node.remove }
 
         return
       end
 
       def extract_instances(doc, hash)
-        doc.root.find(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:instances]}')]/..&quot;).select do |instance_node|
-          instance_node.find_first(&quot;c:subject&quot;)[:resource].split(&quot;/&quot;)[-1] == hash
+        doc.root.xpath(&quot;rdf:Description/rdf:type[contains(@rdf:resource, '#{MATCHERS[:instances]}')]/..&quot;).select do |instance_node|
+          instance_node.xpath(&quot;c:subject[1]&quot;).first[:resource].split(&quot;/&quot;)[-1] == hash
         end.map do |instance_node|
           instance = Instance.from_node(instance_node)
-          instance_node.remove!
+          instance_node.remove
 
           instance
         end
       end
 
       def extract_type(node)
-        node.find(&quot;*[name()='rdf:type']&quot;)[0]['resource'].split('/')[-1]
+        node.xpath(&quot;*[name()='rdf:type']&quot;)[0]['resource'].split('/')[-1]
       rescue
         nil
       end</diff>
      <filename>lib/calais/response.rb</filename>
    </modified>
    <modified>
      <diff>@@ -32,7 +32,7 @@ end
 describe Calais::Client, :params_xml do
   it 'returns an xml encoded string' do
     client = Calais::Client.new(:content =&gt; SAMPLE_DOCUMENT, :license_id =&gt; LICENSE_ID)
-    client.params_xml.should == %[&lt;c:params xmlns:c=&quot;http://s.opencalais.com/1/pred/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;\n  &lt;c:processingDirectives/&gt;\n  &lt;c:userDirectives/&gt;\n&lt;/c:params&gt;]
+    client.params_xml.should == %[&lt;c:params xmlns:c=\&quot;http://s.opencalais.com/1/pred/\&quot; xmlns:rdf=\&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#\&quot;&gt;&lt;c:processingDirectives/&gt;&lt;c:userDirectives/&gt;&lt;/c:params&gt;]
 
     client.content_type = :xml
     client.output_format = :json
@@ -45,7 +45,7 @@ describe Calais::Client, :params_xml do
     client.external_id = Digest::SHA1.hexdigest(client.content)
     client.submitter = 'calais.rb'
 
-    client.params_xml.should == %[&lt;c:params xmlns:c=&quot;http://s.opencalais.com/1/pred/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;\n  &lt;c:processingDirectives c:contentType=&quot;text/xml&quot; c:outputFormat=&quot;application/json&quot; c:reltagBaseURL=&quot;http://opencalais.com&quot; c:enableMetadataType=&quot;GenericRelations&quot; c:discardMetadata=&quot;er/Company;er/Geo&quot;/&gt;\n  &lt;c:userDirectives c:allowDistribution=&quot;true&quot; c:allowSearch=&quot;true&quot; c:externalID=&quot;1a008b91e7d21962e132bc1d6cb252532116a606&quot; c:submitter=&quot;calais.rb&quot;/&gt;\n&lt;/c:params&gt;]
+    client.params_xml.should == %[&lt;c:params xmlns:c=&quot;http://s.opencalais.com/1/pred/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;&lt;c:processingDirectives c:contentType=&quot;text/xml&quot; c:outputFormat=&quot;application/json&quot; c:reltagBaseURL=&quot;http://opencalais.com&quot; c:enableMetadataType=&quot;GenericRelations&quot; c:discardMetadata=&quot;er/Company;er/Geo&quot;/&gt;&lt;c:userDirectives c:allowDistribution=&quot;true&quot; c:allowSearch=&quot;true&quot; c:externalID=&quot;1a008b91e7d21962e132bc1d6cb252532116a606&quot; c:submitter=&quot;calais.rb&quot;/&gt;&lt;/c:params&gt;]
   end
 end
 </diff>
      <filename>spec/calais/client_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>ac8d10314b190aa5a1a365bf5d97475e09ad0fbe</id>
    </parent>
  </parents>
  <author>
    <name>Jeremy Ashkenas</name>
    <email>jashkenas@gmail.com</email>
  </author>
  <url>http://github.com/abhay/calais/commit/0810d3ad00b0aa5b85e34df9e0e6d858d7e30b81</url>
  <id>0810d3ad00b0aa5b85e34df9e0e6d858d7e30b81</id>
  <committed-date>2009-09-18T11:44:36-07:00</committed-date>
  <authored-date>2009-09-18T11:44:36-07:00</authored-date>
  <message>swapping out libxml-ruby for Nokogiri, just because libxml-ruby was segfaulting (on this machine)</message>
  <tree>8b50d07f1f6943e28704fdc9446f682a77bfbb6c</tree>
  <committer>
    <name>Jeremy Ashkenas</name>
    <email>jashkenas@gmail.com</email>
  </committer>
</commit>
