Ruby 调用super';s方法(将命名空间添加到Nokogiri XML文档)

Ruby 调用super';s方法(将命名空间添加到Nokogiri XML文档),ruby,nokogiri,xml-namespaces,Ruby,Nokogiri,Xml Namespaces,我有一个XML文档缺少一些名称空间声明。我知道我可以在使用doc.xpath()方法时定义它,如下所示: doc.xpath('//dc:title', 'dc' => 'http://purl.org/dc/elements/1.1/') 不过,我想添加一次,因为我有很多xpath调用 我发现我的Nokogiri::XML::Document继承自Nokogiri::XML::Node。Node类包含一个add\u namespace()方法。但是我不能叫它,因为它说它是未定义的 这是

我有一个XML文档缺少一些名称空间声明。我知道我可以在使用
doc.xpath()
方法时定义它,如下所示:

doc.xpath('//dc:title', 'dc' => 'http://purl.org/dc/elements/1.1/')
不过,我想添加一次,因为我有很多xpath调用

我发现我的
Nokogiri::XML::Document
继承自
Nokogiri::XML::Node
。Node类包含一个
add\u namespace()
方法。但是我不能叫它,因为它说它是未定义的

这是因为Ruby不允许调用父类的函数吗?有办法解决这个问题吗

编辑

我添加了以下控制台示例:

> c = Nokogiri.XML(doc_text)
> c.class
 => Nokogiri::XML::Document
> c.add_namespace('a','b')
NoMethodError: undefined method `add_namespace' for #<Nokogiri::XML::Document:0x007fea4ee22c60>
>c=Nokogiri.XML(文档文本)
>c级
=>Nokogiri::XML::Document
>c.add_名称空间('a','b'))
NoMethodError:未定义的方法“add_namespace”#
下面是关于Nokogiri::XML类

再次编辑:

原始文档是有效的xml,如下所示:

<root xmlns:ra="...">
  <item>
    <title/>
    <ra:price/>
  </item>
  <item>...
</root>

...
但是项目太多了,我必须为每个项目创建一个对象,序列化并保存在数据库中。因此,对于每个对象,我获取item节点并将其转换为字符串并保存在对象中

现在,在我从DB中恢复对象并希望再次解析item节点之后,我谈到了这个名称空间问题

  • 虽然
    Nokogiri::XML::Document
    确实继承自
    Nokogiri::XML::Node
    ,但一些方法在文档级别被显式删除,包括
    add_namespace

  • 正如@pguardiario所指出的,您希望将名称空间添加到根元素,而不是文档

  • 但是,在解析文档后执行此操作为时已晚。Nokogiri已经创建了节点,丢弃了名称空间:

    require 'nokogiri'
    xml = "<r><a:b/></r>"
    doc = Nokogiri.XML(xml)
    p doc.at('b').namespace
    #=> nil
    
    doc.root.add_namespace 'a', 'foo'
    puts doc
    #=> <?xml version="1.0"?>
    #=> <r xmlns:a="foo">
    #=>   <b/>
    #=> </r>
    
    需要“nokogiri”
    xml=“”
    doc=Nokogiri.XML(XML)
    p doc.at('b')。命名空间
    #=>零
    doc.root.add_名称空间'a','foo'
    放博士
    #=> 
    #=> 
    #=>   
    #=> 
    

  • 在使用Nokogiri进行解析之前,需要将源XML固定为字符串。(除非SAX解析器有办法在您点击第一个节点时添加名称空间,然后再继续。)

    也许您需要c.root.add_namespace('a','b'),因此,要明确的是,您有一个无效的XML文档,如
    ,并且您希望在解析之前或作为解析的一部分定义
    foo
    名称空间?你能提供一个像上面这样的简单例子,以及你想要完成什么吗?是的,谢谢你的回答。我已经重新编辑了我的问题