I think I have a related bug that your patch doesn't fix. If I have a document with a DTD declaration specifying a namespace and an identical document without it the XPath expression finds the node in the document w/o DTD but not with the DTD. The attached test case illustrates the problem, to replicate:

1) Run dtdtest.rb, you will see that the test will fail being unable to find a node via XML::Node.find()

2) Comment out the ATTLIST spec in a.dtd and re-run, test will pass this time (or remove the DTD declaration from the file dtd.xml).


--Paul

On Nov 27, 2007, at 8:39 AM, keisuke fukuda wrote:

So, this should be the patch.

Index: ext/xml/ruby_xml_xpath.c
===================================================================
--- ext/xml/ruby_xml_xpath.c    (revision 218)
+++ ext/xml/ruby_xml_xpath.c    (working copy)
@@ -76,9 +76,9 @@
    }
    else {
      // tuples of prefix/uri
-      if (RARRAY(RARRAY(nslist)->ptr[i])->len == 2) {
-       rprefix = RARRAY(RARRAY(nslist)->ptr[i])->ptr[0];
-       ruri = RARRAY(RARRAY(nslist)->ptr[i])->ptr[1];
+      if (RARRAY(nslist)->len == 2) {
+       rprefix = RARRAY(nslist)->ptr[0];
+       ruri = RARRAY(nslist)->ptr[1];
       ruby_xml_xpath_context_register_namespace(xxpc, rprefix, ruri);
      } else {
       rb_raise(rb_eArgError, "nested array must be an array of
strings, prefix and href/uri");
< xpath_ns_fix.patch.txt>_______________________________________________
libxml-devel mailing list
libxml-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/libxml-devel

Attachment: a.dtd
Description: Binary data

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a PUBLIC "-//Test DTDT" "a.dtd" []>
<a><b>Testing...</b></a>
require 'xml/libxml'

doc1 = XML::Document.file('dtd.xml')
doc2 = XML::Document.file('nodtd.xml')

node1 = doc1.root.find_first('b')
puts "Node from doc w/ DTD declaration not found" unless node1

node2 = doc2.root.find_first('b')
puts "Node from doc w/o DTD declaration not found" unless node2

unless node1.eql?(node2)
  puts "Nodes do not match"
else
  puts "Nodes match"
end

puts "NODE1: #{node1}\nNODE2: #{node2}"
<?xml version="1.0" encoding="UTF-8"?>
<a><b>Testing...</b></a>

_______________________________________________
libxml-devel mailing list
libxml-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/libxml-devel

Reply via email to