class Nokogiri::XML::DocumentFragment - nokogiri-1.15.2 Documentation

# class Nokogiri::XML::DocumentFragment

`DocumentFragment` represents a `DocumentFragment` node in an xml document.

### Public Class Methods

new(document, tags = nil, ctx = nil, options = ParseOptions::DEFAULT_XML) { |options| ... } click to toggle source

Create a new `DocumentFragment` from `tags`.

If `ctx` is present, it is used as a context node for the subtree created, e.g., namespaces will be resolved relative to `ctx`.

    # File lib/nokogiri/xml/document_fragment.rb, line 19
    def initialize(document, tags = nil, ctx = nil, options = ParseOptions::DEFAULT_XML) # rubocop:disable Lint/MissingSuper
      return self unless tags

      options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
      yield options if block_given?

      children = if ctx
        # Fix for issue#490
        if Nokogiri.jruby?
          # fix for issue #770
          ctx.parse("<root #{namespace_declarations(ctx)}>#{tags}</root>", options).children
        else
          ctx.parse(tags, options)
        end
      else
        wrapper_doc = XML::Document.parse("<root>#{tags}</root>", nil, nil, options)
        self.errors = wrapper_doc.errors
        wrapper_doc.xpath("/root/node()")
      end
      children.each { |child| child.parent = self }
    end

new(document) click to toggle source

Create a new `DocumentFragment` element on the `document`

    static VALUE
    new (int argc, VALUE *argv, VALUE klass)
    {
      xmlDocPtr xml_doc;
      xmlNodePtr node;
      VALUE document;
      VALUE rest;
      VALUE rb_node;

      rb_scan_args(argc, argv, "1*", &document, &rest);

      xml_doc = noko_xml_document_unwrap(document);

      node = xmlNewDocFragment(xml_doc->doc);

      noko_xml_document_pin_node(node);

      rb_node = noko_xml_node_wrap(klass, node);
      rb_obj_call_init(rb_node, argc, argv);

      return rb_node;
    }

parse(tags, options = ParseOptions::DEFAULT_XML, &block) click to toggle source

Create a `Nokogiri::XML::DocumentFragment` from `tags`

    # File lib/nokogiri/xml/document_fragment.rb, line 9
    def self.parse(tags, options = ParseOptions::DEFAULT_XML, &block)
      new(XML::Document.new, tags, nil, options, &block)
    end

### Public Instance Methods

css *rules, [namespace-bindings, custom-pseudo-class] click to toggle source

Search this fragment for `CSS` `rules`. `rules` must be one or more `CSS` selectors. For example:

For more information see `Nokogiri::XML::Searchable#css`

    # File lib/nokogiri/xml/document_fragment.rb, line 102
    def css(*args)
      if children.any?
        children.css(*args) # 'children' is a smell here
      else
        NodeSet.new(document)
      end
    end

deconstruct() → Array click to toggle source

Returns the root nodes of this document fragment as an array, to use in pattern matching.

💡 Note that text nodes are returned as well as elements. If you wish to operate only on root elements, you should deconstruct the array returned by `DocumentFragment#elements`.

⚡ This is an experimental feature, available since v1.14.0

Example

    frag = Nokogiri::HTML5.fragment(<<~HTML)
      <div>Start</div>
      This is a <a href="#jump">shortcut</a> for you.
      <div>End</div>
    HTML

    frag.deconstruct
    # => [#(Element:0x35c { name = "div", children = [ #(Text "Start")] }),
    #     #(Text "\n" + "This is a "),
    #     #(Element:0x370 {
    #       name = "a",
    #       attributes = [ #(Attr:0x384 { name = "href", value = "#jump" })],
    #       children = [ #(Text "shortcut")]
    #       }),
    #     #(Text " for you.\n"),
    #     #(Element:0x398 { name = "div", children = [ #(Text "End")] }),
    #     #(Text "\n")]

Example only the elements, not the text nodes.

    frag.elements.deconstruct
    # => [#(Element:0x35c { name = "div", children = [ #(Text "Start")] }),
    #     #(Element:0x370 {
    #       name = "a",
    #       attributes = [ #(Attr:0x384 { name = "href", value = "#jump" })],
    #       children = [ #(Text "shortcut")]
    #       }),
    #     #(Element:0x398 { name = "div", children = [ #(Text "End")] })]

    # File lib/nokogiri/xml/document_fragment.rb, line 190
    def deconstruct
      children.to_a
    end

dup() click to toggle source

    # File lib/nokogiri/xml/document_fragment.rb, line 42
    def dup
      new_document = document.dup
      new_fragment = self.class.new(new_document)
      children.each do |child|
        child.dup(1, new_document).parent = new_fragment
      end
      new_fragment
    end

errors() click to toggle source

A list of `Nokogiri::XML::SyntaxError` found when parsing a document

    # File lib/nokogiri/xml/document_fragment.rb, line 136
    def errors
      document.errors
    end

fragment(data) click to toggle source

    # File lib/nokogiri/xml/document_fragment.rb, line 144
    def fragment(data)
      document.fragment(data)
    end

name() click to toggle source

return the name for `DocumentFragment`

    # File lib/nokogiri/xml/document_fragment.rb, line 54
    def name
      "#document-fragment"
    end

search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class] click to toggle source

Search this fragment for `paths`. `paths` must be one or more `XPath` or `CSS` queries.

For more information see `Nokogiri::XML::Searchable#search`

    # File lib/nokogiri/xml/document_fragment.rb, line 121
    def search(*rules)
      rules, handler, ns, binds = extract_params(rules)

      rules.inject(NodeSet.new(document)) do |set, rule|
        set + if Searchable::LOOKS_LIKE_XPATH.match?(rule)
          xpath(*[rule, ns, handler, binds].compact)
        else
          children.css(*[rule, ns, handler].compact) # 'children' is a smell here
        end
      end
    end

serialize()
Alias for: to_s
to_html(*args) click to toggle source

Convert this `DocumentFragment` to html See `Nokogiri::XML::NodeSet#to_html`

    # File lib/nokogiri/xml/document_fragment.rb, line 67
    def to_html(*args)
      if Nokogiri.jruby?
        options = args.first.is_a?(Hash) ? args.shift : {}
        options[:save_with] ||= Node::SaveOptions::DEFAULT_HTML
        args.insert(0, options)
      end
      children.to_html(*args)
    end

to_s() click to toggle source

Convert this `DocumentFragment` to a string

    # File lib/nokogiri/xml/document_fragment.rb, line 60
    def to_s
      children.to_s
    end

Also aliased as: serialize
to_xhtml(*args) click to toggle source

Convert this `DocumentFragment` to xhtml See `Nokogiri::XML::NodeSet#to_xhtml`

    # File lib/nokogiri/xml/document_fragment.rb, line 79
    def to_xhtml(*args)
      if Nokogiri.jruby?
        options = args.first.is_a?(Hash) ? args.shift : {}
        options[:save_with] ||= Node::SaveOptions::DEFAULT_XHTML
        args.insert(0, options)
      end
      children.to_xhtml(*args)
    end

to_xml(*args) click to toggle source

Convert this `DocumentFragment` to xml See `Nokogiri::XML::NodeSet#to_xml`

    # File lib/nokogiri/xml/document_fragment.rb, line 91
    def to_xml(*args)
      children.to_xml(*args)
    end

### Private Instance Methods

namespace_declarations(ctx) click to toggle source

fix for issue 770

    # File lib/nokogiri/xml/document_fragment.rb, line 197
    def namespace_declarations(ctx)
      ctx.namespace_scopes.map do |namespace|
        prefix = namespace.prefix.nil? ? "" : ":#{namespace.prefix}"
        %{xmlns#{prefix}="#{namespace.href}"}
      end.join(" ")
    end