调用super的方法(将命名空间添加到Nokogiri XML文档)

时间:2011-11-01 02:29:32

标签: 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_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>

这是关于Nokogiri :: XML类的API document

再次编辑:

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

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

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

现在,在我从数据库恢复对象并且我想再次解析项目节点后,我遇到了这个名称空间问题。

1 个答案:

答案 0 :(得分:4)

  1. 虽然Nokogiri::XML::Document确实从Nokogiri::XML::Node继承,但在文档级别明确删除了一些方法,包括add_namespace

    https://github.com/tenderlove/nokogiri/blob/master/lib/nokogiri/xml/document.rb#L203

  2. 正如@pguardiario所说,您希望将名称空间添加到根元素,而不是文档。

  3. 但是,在解析文档后执行此操作为时已晚。 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>
    
  4. 在使用Nokogiri解析之前,您需要将源XML修复为字符串。 (除非有一些方法可以让SAX解析器在您点击第一个节点时添加命名空间,然后再继续。)