您需要提供有关导致该错误的原因的更多详细信息。仅解析 XML 文档不会让 Nokogiri 抛出该错误;相反,它将忽略并丢弃未声明的命名空间:
require 'nokogiri'
# Here's a valid namespace used on an element:
doc = Nokogiri.XML("<root xmlns:a='hi'><a:foo/></root>")
puts doc.root
#=> <root xmlns:a="hi">
#=> <a:foo/>
#=> </root>
# Here's a namespace that gets ignored
doc = Nokogiri.XML("<root xmlns:a='hi'><zzz:foo/></root>")
puts doc
#=> <root xmlns:a="hi">
#=> <foo/>
#=> </root>
p doc.at('foo').namespace
#=> nil
# It's OK to declare namespaces later on
doc = Nokogiri.XML("<root><kid xmlns:zzz='yo'><zzz:foo/></kid></root>")
puts doc.root
#=> <root>
#=> <kid xmlns:zzz="yo">
#=> <zzz:foo/>
#=> </kid>
#=> </root>
解析使用从未声明不可撤销的名称空间的 XML 文档会丢失它们。因此,即使您可以像这样在任何节点上设置属性......
mynode["xmlns:yay"]="someurl"
...它对您已经解析的引用该命名空间名称的节点没有帮助。
现在,也许您的问题是您正在按稍后声明的命名空间搜索节点?
p doc.at_xpath('//zzz:foo')
#=> in `evaluate': Undefined namespace prefix: //zzz:foo (Nokogiri::XML::XPath::SyntaxError)
如果是这样,你必须告诉 Nokogiri 命名空间:
p doc.at_xpath('//zzz:foo','zzz'=>'yo')
#=> #<Nokogiri::XML::Element:0x80691894 name="foo" namespace=#<Nokogiri::XML::Namespace:0x806917cc prefix="zzz" href="yo">>
或者,如果您只是解析文档(以后不将其作为 XML 发出)并且您没有任何名称冲突,您可以作弊并丢弃所有命名空间以进行更简单的查询:
p doc.at_xpath('//foo')
#=> nil
doc.remove_namespaces!
p doc.at_xpath('//foo')
#=> #<Nokogiri::XML::Element:0x805fa2dc name="foo">