Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nokogiri/Xpath namespace query

I'm trying to pull out the dc:title element using an xpath. I can pull out the metadata using the following code.

doc = <<END <?xml version="1.0" encoding="UTF-8"?> <package xmlns="http://www.idpf.org/2007/opf" version="2.0">   <metadata xmlns:dc="URI">     <dc:title>title text</dc:title>   </metadata> </package> END  doc = Nokogiri::XML(doc)  # Awesome this works! puts '//xmlns:metadata' puts doc.xpath('//xmlns:metadata') # => <metadata xmlns:dc="URI"><dc:title>title text</dc:title></metadata> 

As you can see the above appears to work correctly. However I don't seem to be able to get the title information from this node tree, all of the below fail.

puts doc.xpath('//xmlns:metadata/title') # => nil  puts doc.xpath('//xmlns:metadata/dc:title') # => ERROR: `evaluate': Undefined namespace prefix  puts doc.xpath('//xmlns:dc:title') # => ERROR: 'evaluate': Invalid expression: //xmlns:dc:title 

Could someone please explain how namespaces should be used in an xpath with the above xml doc.

like image 970
Jamie Avatar asked Jan 14 '11 11:01

Jamie


1 Answers

All namespaces need to be registered when parsing. Nokogiri automatically registers namespaces on the root node. Any namespaces that are not on the root node you have to register yourself. This should work:

puts doc.xpath('//dc:title', 'dc' => "URI") 

Alternately, you can remove namespaces altogether. Only do this if you are certain there will be no conflicting node names.

doc.remove_namespaces! puts doc.xpath('//title') 
like image 191
Mark Thomas Avatar answered Sep 21 '22 07:09

Mark Thomas