Class: Nokogiri::XML::Document
- Defined in:
- lib/nokogiri/xml/document.rb,
ext/nokogiri/xml_document.c,
ext/nokogiri/html_document.c
Overview
Nokogiri::XML::Document is the main entry point for dealing with XML documents. The Document is created by parsing an XML document. See Nokogiri::XML::Document.parse() for more information on parsing.
For searching a Document, see Nokogiri::XML::Searchable#css and Nokogiri::XML::Searchable#xpath
Direct Known Subclasses
Constant Summary collapse
- NCNAME_START_CHAR =
I’m ignoring unicode characters here. See www.w3.org/TR/REC-xml-names/#ns-decl for more details.
"A-Za-z_"
- NCNAME_CHAR =
NCNAME_START_CHAR + "\\-.0-9"
- NCNAME_RE =
/^xmlns(:[#{NCNAME_START_CHAR}][#{NCNAME_CHAR}]*)?$/
Constants inherited from Node
Node::ATTRIBUTE_DECL, Node::ATTRIBUTE_NODE, Node::CDATA_SECTION_NODE, Node::COMMENT_NODE, Node::DOCB_DOCUMENT_NODE, Node::DOCUMENT_FRAG_NODE, Node::DOCUMENT_NODE, Node::DOCUMENT_TYPE_NODE, Node::DTD_NODE, Node::ELEMENT_DECL, Node::ELEMENT_NODE, Node::ENTITY_DECL, Node::ENTITY_NODE, Node::ENTITY_REF_NODE, Node::HTML_DOCUMENT_NODE, Node::NAMESPACE_DECL, Node::NOTATION_NODE, Node::PI_NODE, Node::TEXT_NODE, Node::XINCLUDE_END, Node::XINCLUDE_START
Constants included from Searchable
Instance Attribute Summary collapse
-
#errors ⇒ Object
A list of Nokogiri::XML::SyntaxError found when parsing a document.
Class Method Summary collapse
-
.new(version = default) ⇒ Object
Create a new document with
version
(defaults to “1.0”). -
.parse(string_or_io, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML) {|options| ... } ⇒ Object
Parse an XML file.
-
.read_io(io, url, encoding, options) ⇒ Object
Create a new document from an IO object.
-
.read_memory(string, url, encoding, options) ⇒ Object
Create a new document from a String.
-
.wrap(document) ⇒ Object
JRuby
Wraps Java’s org.w3c.dom.document and returns Nokogiri::XML::Document.
Instance Method Summary collapse
- #add_child(node_or_tags) ⇒ Object (also: #<<)
-
#canonicalize(*args) ⇒ Object
Canonicalize a document and return the results.
-
#collect_namespaces ⇒ Object
Recursively get all namespaces from this node and its subtree and return them as a hash.
-
#create_cdata(string, &block) ⇒ Object
Create a CDATA Node containing
string
. -
#create_comment(string, &block) ⇒ Object
Create a Comment Node containing
string
. -
#create_element(name, *args, &block) ⇒ Object
Create an element with
name
, and optionally setting the content and attributes. -
#create_entity(name, type, external_id, system_id, content) ⇒ Object
Create a new entity named
name
. -
#create_text_node(string, &block) ⇒ Object
Create a Text Node with
string
. -
#decorate(node) ⇒ Object
Apply any decorators to
node
. -
#decorators(key) ⇒ Object
Get the list of decorators given
key
. -
#document ⇒ Object
A reference to
self
. -
#dup ⇒ Object
(also: #clone)
Copy this Document.
-
#encoding ⇒ Object
Get the encoding for this Document.
-
#encoding=(encoding) ⇒ Object
Set the encoding string for this Document.
-
#fragment(tags = nil) ⇒ Object
Create a Nokogiri::XML::DocumentFragment from
tags
Returns an empty fragment iftags
is nil. -
#initialize(*args) ⇒ Document
constructor
:nodoc:.
-
#name ⇒ Object
The name of this document.
-
#namespaces ⇒ Object
Get the hash of namespaces on the root Nokogiri::XML::Node.
-
#remove_namespaces! ⇒ Object
Remove all namespaces from all nodes in the document.
-
#root ⇒ Object
Get the root node for this document.
-
#root= ⇒ Object
Set the root element on this document.
-
#slop! ⇒ Object
Explore a document with shortcut methods.
-
#to_java ⇒ Object
JRuby
Returns Java’s org.w3c.dom.document of this Document. -
#url ⇒ Object
Get the url name for this document.
-
#validate ⇒ Object
Validate this Document against it’s DTD.
-
#version ⇒ Object
Get the XML version for this Document.
Methods inherited from Node
#<=>, #==, #>, #[], #[]=, #accept, #add_namespace_definition, #add_next_sibling, #add_previous_sibling, #after, #ancestors, #attribute, #attribute_nodes, #attribute_with_ns, #attributes, #before, #blank?, #cdata?, #child, #children, #children=, #comment?, #content, #content=, #create_external_subset, #create_internal_subset, #css_path, #decorate!, #default_namespace=, #description, #do_xinclude, #document?, #each, #element?, #element_children, #encode_special_chars, #external_subset, #first_element_child, #fragment?, #html?, #inner_html, #inner_html=, #internal_subset, #key?, #keys, #lang, #lang=, #last_element_child, #line, #matches?, #namespace, #namespace=, #namespace_definitions, #namespace_scopes, #namespaced_key?, #native_content=, #next_element, #next_sibling, #node_name, #node_name=, #node_type, #parent, #parent=, #parse, #path, #pointer_id, #prepend_child, #previous_element, #previous_sibling, #processing_instruction?, #read_only?, #remove_attribute, #replace, #serialize, #swap, #text?, #to_html, #to_s, #to_xhtml, #traverse, #unlink, #values, #write_html_to, #write_to, #write_xhtml_to, #write_xml_to, #xml?
Methods included from Searchable
#at, #at_css, #at_xpath, #css, #search, #xpath
Methods included from PP::Node
Constructor Details
#initialize(*args) ⇒ Document
:nodoc:
73 74 75 76 |
# File 'lib/nokogiri/xml/document.rb', line 73 def initialize *args # :nodoc: @errors = [] @decorators = nil end |
Instance Attribute Details
#errors ⇒ Object
A list of Nokogiri::XML::SyntaxError found when parsing a document
71 72 73 |
# File 'lib/nokogiri/xml/document.rb', line 71 def errors @errors end |
Class Method Details
.new(version = default) ⇒ Object
Create a new document with version
(defaults to “1.0”)
349 350 351 352 353 354 355 356 357 358 359 360 361 362 |
# File 'ext/nokogiri/xml_document.c', line 349
static VALUE new(int argc, VALUE *argv, VALUE klass)
{
xmlDocPtr doc;
VALUE version, rest, rb_doc ;
rb_scan_args(argc, argv, "0*", &rest);
version = rb_ary_entry(rest, (long)0);
if (NIL_P(version)) version = rb_str_new2("1.0");
doc = xmlNewDoc((xmlChar *)StringValueCStr(version));
rb_doc = Nokogiri_wrap_xml_document(klass, doc);
rb_obj_call_init(rb_doc, argc, argv);
return rb_doc ;
}
|
.parse(string_or_io, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML) {|options| ... } ⇒ Object
Parse an XML file.
string_or_io
may be a String, or any object that responds to read and close such as an IO, or StringIO.
url
(optional) is the URI where this document is located.
encoding
(optional) is the encoding that should be used when processing the document.
options
(optional) is a configuration object that sets options during parsing, such as Nokogiri::XML::ParseOptions::RECOVER. See the Nokogiri::XML::ParseOptions for more information.
block
(optional) is passed a configuration object on which parse options may be set.
When parsing untrusted documents, it’s recommended that the nonet
option be used, as shown in this example code:
Nokogiri::XML::Document.parse(xml_string) { |config| config.nonet }
Nokogiri.XML() is a convenience method which will call this method.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/nokogiri/xml/document.rb', line 43 def self.parse string_or_io, url = nil, encoding = nil, = ParseOptions::DEFAULT_XML, &block = Nokogiri::XML::ParseOptions.new() if Fixnum === # Give the options to the user yield if block_given? if empty_doc?(string_or_io) if .strict? raise Nokogiri::XML::SyntaxError.new("Empty document") else return encoding ? new.tap { |i| i.encoding = encoding } : new end end doc = if string_or_io.respond_to?(:read) url ||= string_or_io.respond_to?(:path) ? string_or_io.path : nil read_io(string_or_io, url, encoding, .to_i) else # read_memory pukes on empty docs read_memory(string_or_io, url, encoding, .to_i) end # do xinclude processing doc.do_xinclude() if .xinclude? return doc end |
.read_io(io, url, encoding, options) ⇒ Object
Create a new document from an IO object
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 |
# File 'ext/nokogiri/xml_document.c', line 225
static VALUE read_io( VALUE klass,
VALUE io,
VALUE url,
VALUE encoding,
VALUE options )
{
const char * c_url = NIL_P(url) ? NULL : StringValueCStr(url);
const char * c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
VALUE error_list = rb_ary_new();
VALUE document;
xmlDocPtr doc;
xmlResetLastError();
xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
doc = xmlReadIO(
(xmlInputReadCallback)io_read_callback,
(xmlInputCloseCallback)io_close_callback,
(void *)io,
c_url,
c_enc,
(int)NUM2INT(options)
);
xmlSetStructuredErrorFunc(NULL, NULL);
if(doc == NULL) {
xmlErrorPtr error;
xmlFreeDoc(doc);
error = xmlGetLastError();
if(error)
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
else
rb_raise(rb_eRuntimeError, "Could not parse document");
return Qnil;
}
document = Nokogiri_wrap_xml_document(klass, doc);
rb_iv_set(document, "@errors", error_list);
return document;
}
|
.read_memory(string, url, encoding, options) ⇒ Object
Create a new document from a String
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
# File 'ext/nokogiri/xml_document.c', line 275
static VALUE read_memory( VALUE klass,
VALUE string,
VALUE url,
VALUE encoding,
VALUE options )
{
const char * c_buffer = StringValuePtr(string);
const char * c_url = NIL_P(url) ? NULL : StringValueCStr(url);
const char * c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
int len = (int)RSTRING_LEN(string);
VALUE error_list = rb_ary_new();
VALUE document;
xmlDocPtr doc;
xmlResetLastError();
xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
doc = xmlReadMemory(c_buffer, len, c_url, c_enc, (int)NUM2INT(options));
xmlSetStructuredErrorFunc(NULL, NULL);
if(doc == NULL) {
xmlErrorPtr error;
xmlFreeDoc(doc);
error = xmlGetLastError();
if(error)
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
else
rb_raise(rb_eRuntimeError, "Could not parse document");
return Qnil;
}
document = Nokogiri_wrap_xml_document(klass, doc);
rb_iv_set(document, "@errors", error_list);
return document;
}
|
Instance Method Details
#add_child(node_or_tags) ⇒ Object Also known as: <<
241 242 243 244 245 246 247 248 249 250 |
# File 'lib/nokogiri/xml/document.rb', line 241 def add_child raise "Document already has a root node" if root && root.name != 'nokogiri_text_wrapper' = coerce() if .is_a?(XML::NodeSet) raise "Document cannot have multiple root nodes" if .size > 1 super(.first) else super end end |
#canonicalize(mode = XML_C14N_1_0, inclusive_namespaces = nil, with_comments = false) ⇒ Object #canonicalize {|obj, parent| ... } ⇒ Object
Canonicalize a document and return the results. Takes an optional block that takes two parameters: the obj
and that node’s parent
. The obj
will be either a Nokogiri::XML::Node, or a Nokogiri::XML::Namespace The block must return a non-nil, non-false value if the obj
passed in should be included in the canonicalized document.
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 |
# File 'ext/nokogiri/xml_document.c', line 492
static VALUE canonicalize(int argc, VALUE* argv, VALUE self)
{
VALUE mode;
VALUE incl_ns;
VALUE with_comments;
xmlChar **ns;
long ns_len, i;
xmlDocPtr doc;
xmlOutputBufferPtr buf;
xmlC14NIsVisibleCallback cb = NULL;
void * ctx = NULL;
VALUE rb_cStringIO;
VALUE io;
rb_scan_args(argc, argv, "03", &mode, &incl_ns, &with_comments);
Data_Get_Struct(self, xmlDoc, doc);
rb_cStringIO = rb_const_get_at(rb_cObject, rb_intern("StringIO"));
io = rb_class_new_instance(0, 0, rb_cStringIO);
buf = xmlAllocOutputBuffer(NULL);
buf->writecallback = (xmlOutputWriteCallback)io_write_callback;
buf->closecallback = (xmlOutputCloseCallback)io_close_callback;
buf->context = (void *)io;
if(rb_block_given_p()) {
cb = block_caller;
ctx = (void *)rb_block_proc();
}
if(NIL_P(incl_ns)){
ns = NULL;
}
else{
Check_Type(incl_ns, T_ARRAY);
ns_len = RARRAY_LEN(incl_ns);
ns = calloc((size_t)ns_len+1, sizeof(xmlChar *));
for (i = 0 ; i < ns_len ; i++) {
VALUE entry = rb_ary_entry(incl_ns, i);
const char * ptr = StringValueCStr(entry);
ns[i] = (xmlChar*) ptr;
}
}
xmlC14NExecute(doc, cb, ctx,
(int) (NIL_P(mode) ? 0 : NUM2INT(mode)),
ns,
(int) RTEST(with_comments),
buf);
xmlOutputBufferClose(buf);
return rb_funcall(io, rb_intern("string"), 0);
}
|
#collect_namespaces ⇒ Object
Recursively get all namespaces from this node and its subtree and return them as a hash.
For example, given this document:
<root xmlns:foo="bar">
<bar xmlns:hello="world" />
</root>
This method will return:
{ 'xmlns:foo' => 'bar', 'xmlns:hello' => 'world' }
WARNING: this method will clobber duplicate names in the keys. For example, given this document:
<root xmlns:foo="bar">
<bar xmlns:foo="baz" />
</root>
The hash returned will look like this: { ‘xmlns:foo’ => ‘bar’ }
Non-prefixed default namespaces (as in “xmlns=”) are not included in the hash.
Note that this method does an xpath lookup for nodes with namespaces, and as a result the order may be dependent on the implementation of the underlying XML library.
166 167 168 169 170 171 |
# File 'lib/nokogiri/xml/document.rb', line 166 def collect_namespaces xpath("//namespace::*").inject({}) do |hash, ns| hash[["xmlns",ns.prefix].compact.join(":")] = ns.href if ns.prefix != "xml" hash end end |
#create_cdata(string, &block) ⇒ Object
Create a CDATA Node containing string
117 118 119 |
# File 'lib/nokogiri/xml/document.rb', line 117 def create_cdata string, &block Nokogiri::XML::CDATA.new self, string.to_s, &block end |
#create_comment(string, &block) ⇒ Object
Create a Comment Node containing string
122 123 124 |
# File 'lib/nokogiri/xml/document.rb', line 122 def create_comment string, &block Nokogiri::XML::Comment.new self, string.to_s, &block end |
#create_element(name, *args, &block) ⇒ Object
Create an element with name
, and optionally setting the content and attributes.
doc.create_element "div" # <div></div>
doc.create_element "div", :class => "container" # <div class='container'></div>
doc.create_element "div", "contents" # <div>contents</div>
doc.create_element "div", "contents", :class => "container" # <div class='container'>contents</div>
doc.create_element "div" { |node| node['class'] = "container" } # <div class='container'></div>
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/nokogiri/xml/document.rb', line 87 def create_element name, *args, &block elm = Nokogiri::XML::Element.new(name, self, &block) args.each do |arg| case arg when Hash arg.each { |k,v| key = k.to_s if key =~ NCNAME_RE ns_name = key.split(":", 2)[1] elm.add_namespace_definition ns_name, v else elm[k.to_s] = v.to_s end } else elm.content = arg end end if ns = elm.namespace_definitions.find { |n| n.prefix.nil? or n.prefix == '' } elm.namespace = ns end elm end |
#create_entity(name, type, external_id, system_id, content) ⇒ Object
Create a new entity named name
.
type
is an integer representing the type of entity to be created, and it defaults to Nokogiri::XML::EntityDecl::INTERNAL_GENERAL. See the constants on Nokogiri::XML::EntityDecl for more information.
external_id
, system_id
, and content
set the External ID, System ID, and content respectively. All of these parameters are optional.
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 |
# File 'ext/nokogiri/xml_document.c', line 421
static VALUE create_entity(int argc, VALUE *argv, VALUE self)
{
VALUE name;
VALUE type;
VALUE external_id;
VALUE system_id;
VALUE content;
xmlEntityPtr ptr;
xmlDocPtr doc ;
Data_Get_Struct(self, xmlDoc, doc);
rb_scan_args(argc, argv, "14", &name, &type, &external_id, &system_id,
&content);
xmlResetLastError();
ptr = xmlAddDocEntity(
doc,
(xmlChar *)(NIL_P(name) ? NULL : StringValueCStr(name)),
(int) (NIL_P(type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(type)),
(xmlChar *)(NIL_P(external_id) ? NULL : StringValueCStr(external_id)),
(xmlChar *)(NIL_P(system_id) ? NULL : StringValueCStr(system_id)),
(xmlChar *)(NIL_P(content) ? NULL : StringValueCStr(content))
);
if(NULL == ptr) {
xmlErrorPtr error = xmlGetLastError();
if(error)
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
else
rb_raise(rb_eRuntimeError, "Could not create entity");
return Qnil;
}
return Nokogiri_wrap_xml_node(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr);
}
|
#create_text_node(string, &block) ⇒ Object
Create a Text Node with string
112 113 114 |
# File 'lib/nokogiri/xml/document.rb', line 112 def create_text_node string, &block Nokogiri::XML::Text.new string.to_s, self, &block end |
#decorate(node) ⇒ Object
Apply any decorators to node
214 215 216 217 218 219 220 |
# File 'lib/nokogiri/xml/document.rb', line 214 def decorate node return unless @decorators @decorators.each { |klass,list| next unless node.is_a?(klass) list.each { |moodule| node.extend(moodule) } } end |
#decorators(key) ⇒ Object
Get the list of decorators given key
174 175 176 177 |
# File 'lib/nokogiri/xml/document.rb', line 174 def decorators key @decorators ||= Hash.new @decorators[key] ||= [] end |
#document ⇒ Object
A reference to self
132 133 134 |
# File 'lib/nokogiri/xml/document.rb', line 132 def document self end |
#dup ⇒ Object Also known as: clone
Copy this Document. An optional depth may be passed in, but it defaults to a deep copy. 0 is a shallow copy, 1 is a deep copy.
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 |
# File 'ext/nokogiri/xml_document.c', line 320
static VALUE duplicate_document(int argc, VALUE *argv, VALUE self)
{
xmlDocPtr doc, dup;
VALUE copy;
VALUE level;
VALUE error_list;
if(rb_scan_args(argc, argv, "01", &level) == 0)
level = INT2NUM((long)1);
Data_Get_Struct(self, xmlDoc, doc);
dup = xmlCopyDoc(doc, (int)NUM2INT(level));
if(dup == NULL) return Qnil;
dup->type = doc->type;
copy = Nokogiri_wrap_xml_document(rb_obj_class(self), dup);
error_list = rb_iv_get(self, "@errors");
rb_iv_set(copy, "@errors", error_list);
return copy ;
}
|
#encoding ⇒ Object
Get the encoding for this Document
195 196 197 198 199 200 201 202 |
# File 'ext/nokogiri/xml_document.c', line 195
static VALUE encoding(VALUE self)
{
xmlDocPtr doc;
Data_Get_Struct(self, xmlDoc, doc);
if(!doc->encoding) return Qnil;
return NOKOGIRI_STR_NEW2(doc->encoding);
}
|
#encoding=(encoding) ⇒ Object
Set the encoding string for this Document
176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'ext/nokogiri/xml_document.c', line 176
static VALUE set_encoding(VALUE self, VALUE encoding)
{
xmlDocPtr doc;
Data_Get_Struct(self, xmlDoc, doc);
if (doc->encoding)
free((char *) doc->encoding); /* this may produce a gcc cast warning */
doc->encoding = xmlStrdup((xmlChar *)StringValueCStr(encoding));
return encoding;
}
|
#fragment(tags = nil) ⇒ Object
Create a Nokogiri::XML::DocumentFragment from tags
Returns an empty fragment if tags
is nil.
233 234 235 |
# File 'lib/nokogiri/xml/document.rb', line 233 def fragment = nil DocumentFragment.new(self, , self.root) end |
#name ⇒ Object
The name of this document. Always returns “document”
127 128 129 |
# File 'lib/nokogiri/xml/document.rb', line 127 def name 'document' end |
#namespaces ⇒ Object
Get the hash of namespaces on the root Nokogiri::XML::Node
226 227 228 |
# File 'lib/nokogiri/xml/document.rb', line 226 def namespaces root ? root.namespaces : {} end |
#remove_namespaces! ⇒ Object
Remove all namespaces from all nodes in the document.
This could be useful for developers who either don’t understand namespaces or don’t care about them.
The following example shows a use case, and you can decide for yourself whether this is a good thing or not:
doc = Nokogiri::XML <<-EOXML
<root>
<car xmlns:part="http://general-motors.com/">
<part:tire>Michelin Model XGV</part:tire>
</car>
<bicycle xmlns:part="http://schwinn.com/">
<part:tire>I'm a bicycle tire!</part:tire>
</bicycle>
</root>
EOXML
doc.xpath("//tire").to_s # => ""
doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => "<part:tire>Michelin Model XGV</part:tire>"
doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => "<part:tire>I'm a bicycle tire!</part:tire>"
doc.remove_namespaces!
doc.xpath("//tire").to_s # => "<tire>Michelin Model XGV</tire><tire>I'm a bicycle tire!</tire>"
doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => ""
doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => ""
For more information on why this probably is not a good thing in general, please direct your browser to tenderlovemaking.com/2009/04/23/namespaces-in-xml.html
401 402 403 404 405 406 407 408 |
# File 'ext/nokogiri/xml_document.c', line 401
VALUE remove_namespaces_bang(VALUE self)
{
xmlDocPtr doc ;
Data_Get_Struct(self, xmlDoc, doc);
recursively_remove_namespaces_from_node((xmlNodePtr)doc);
return self;
}
|
#root ⇒ Object
Get the root node for this document.
157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'ext/nokogiri/xml_document.c', line 157
static VALUE root(VALUE self)
{
xmlDocPtr doc;
xmlNodePtr root;
Data_Get_Struct(self, xmlDoc, doc);
root = xmlDocGetRootElement(doc);
if(!root) return Qnil;
return Nokogiri_wrap_xml_node(Qnil, root) ;
}
|
#root= ⇒ Object
Set the root element on this document
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'ext/nokogiri/xml_document.c', line 113
static VALUE set_root(VALUE self, VALUE root)
{
xmlDocPtr doc;
xmlNodePtr new_root;
xmlNodePtr old_root;
Data_Get_Struct(self, xmlDoc, doc);
old_root = NULL;
if(NIL_P(root)) {
old_root = xmlDocGetRootElement(doc);
if(old_root) {
xmlUnlinkNode(old_root);
nokogiri_root_node(old_root);
}
return root;
}
Data_Get_Struct(root, xmlNode, new_root);
/* If the new root's document is not the same as the current document,
* then we need to dup the node in to this document. */
if(new_root->doc != doc) {
old_root = xmlDocGetRootElement(doc);
if (!(new_root = xmlDocCopyNode(new_root, doc, 1))) {
rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)");
}
}
xmlDocSetRootElement(doc, new_root);
if(old_root) nokogiri_root_node(old_root);
return root;
}
|
#slop! ⇒ Object
Explore a document with shortcut methods. See Nokogiri::Slop for details.
Note that any nodes that have been instantiated before #slop! is called will not be decorated with sloppy behavior. So, if you’re in irb, the preferred idiom is:
irb> doc = Nokogiri::Slop my_markup
and not
irb> doc = Nokogiri::HTML my_markup
... followed by irb's implicit inspect (and therefore instantiation of every node) ...
irb> doc.slop!
... which does absolutely nothing.
203 204 205 206 207 208 209 210 |
# File 'lib/nokogiri/xml/document.rb', line 203 def slop! unless decorators(XML::Node).include? Nokogiri::Decorators::Slop decorators(XML::Node) << Nokogiri::Decorators::Slop decorate! end self end |
#to_java ⇒ Object
JRuby
Returns Java’s org.w3c.dom.document of this Document.
264 265 266 267 |
# File 'lib/nokogiri/xml/document.rb', line 264 def to_java raise "JRuby only method" unless Nokogiri.jruby? return toJavaDocument() end |
#url ⇒ Object
Get the url name for this document.
97 98 99 100 101 102 103 104 105 |
# File 'ext/nokogiri/xml_document.c', line 97
static VALUE url(VALUE self)
{
xmlDocPtr doc;
Data_Get_Struct(self, xmlDoc, doc);
if(doc->URL) return NOKOGIRI_STR_NEW2(doc->URL);
return Qnil;
}
|
#validate ⇒ Object
Validate this Document against it’s DTD. Returns a list of errors on the document or nil
when there is no DTD.
182 183 184 185 |
# File 'lib/nokogiri/xml/document.rb', line 182 def validate return nil unless internal_subset internal_subset.validate self end |
#version ⇒ Object
Get the XML version for this Document
210 211 212 213 214 215 216 217 |
# File 'ext/nokogiri/xml_document.c', line 210
static VALUE version(VALUE self)
{
xmlDocPtr doc;
Data_Get_Struct(self, xmlDoc, doc);
if(!doc->version) return Qnil;
return NOKOGIRI_STR_NEW2(doc->version);
}
|