Class: LibXML::XML::Reader

Inherits:
Object
  • Object
show all
Defined in:
ext/libxml/ruby_xml_reader.c,
lib/libxml/reader.rb,
ext/libxml/ruby_xml_reader.c

Overview

The XML::Reader class provides a simpler, alternative way of parsing an XML document in contrast to XML::Parser or XML::SaxParser. A XML::Reader instance acts like a cursor going forward in a document stream, stopping at each node it encounters. To advance to the next node, simply cadd XML::Reader#read.

The XML::Reader API closely matches the DOM Core specification and supports namespaces, xml:base, entity handling and DTDs.

To summarize, XML::Reader provides a far simpler API to use versus XML::SaxParser and is more memory efficient than using XML::Parser to create a DOM tree.

Example:

reader = XML::Reader.string("<foo><bar>1</bar><bar>2</bar><bar>3</bar></foo>")
reader.read
assert_equal('foo', reader.name)
assert_equal(nil, reader.value)

3.times do |i|
  reader.read
  assert_equal(XML::Reader::TYPE_ELEMENT, reader.node_type)
  assert_equal('bar', reader.name)
  reader.read
  assert_equal(XML::Reader::TYPE_TEXT, reader.node_type)
  assert_equal((i + 1).to_s, reader.value)
  reader.read
  assert_equal(XML::Reader::TYPE_END_ELEMENT, reader.node_type)
end

You can also parse documents (see XML::Reader.document), strings (see XML::Parser.string) and io objects (see XML::Parser.io).

For a more in depth tutorial, albeit in C, see xmlsoft.org/xmlreader.html.

Constant Summary collapse

LOADDTD =

Constants

INT2FIX(XML_PARSER_LOADDTD)
DEFAULTATTRS =
INT2FIX(XML_PARSER_DEFAULTATTRS)
VALIDATE =
INT2FIX(XML_PARSER_VALIDATE)
SUBST_ENTITIES =
INT2FIX(XML_PARSER_SUBST_ENTITIES)
SEVERITY_VALIDITY_WARNING =
INT2FIX(XML_PARSER_SEVERITY_VALIDITY_WARNING)
SEVERITY_VALIDITY_ERROR =
INT2FIX(XML_PARSER_SEVERITY_VALIDITY_ERROR)
SEVERITY_WARNING =
INT2FIX(XML_PARSER_SEVERITY_WARNING)
SEVERITY_ERROR =
INT2FIX(XML_PARSER_SEVERITY_ERROR)
TYPE_NONE =
INT2FIX(XML_READER_TYPE_NONE)
TYPE_ELEMENT =
INT2FIX(XML_READER_TYPE_ELEMENT)
TYPE_ATTRIBUTE =
INT2FIX(XML_READER_TYPE_ATTRIBUTE)
TYPE_TEXT =
INT2FIX(XML_READER_TYPE_TEXT)
TYPE_CDATA =
INT2FIX(XML_READER_TYPE_CDATA)
TYPE_ENTITY_REFERENCE =
INT2FIX(XML_READER_TYPE_ENTITY_REFERENCE)
TYPE_ENTITY =
INT2FIX(XML_READER_TYPE_ENTITY)
TYPE_PROCESSING_INSTRUCTION =
INT2FIX(XML_READER_TYPE_PROCESSING_INSTRUCTION)
TYPE_COMMENT =
INT2FIX(XML_READER_TYPE_COMMENT)
TYPE_DOCUMENT =
INT2FIX(XML_READER_TYPE_DOCUMENT)
TYPE_DOCUMENT_TYPE =
INT2FIX(XML_READER_TYPE_DOCUMENT_TYPE)
TYPE_DOCUMENT_FRAGMENT =
INT2FIX(XML_READER_TYPE_DOCUMENT_FRAGMENT)
TYPE_NOTATION =
INT2FIX(XML_READER_TYPE_NOTATION)
TYPE_WHITESPACE =
INT2FIX(XML_READER_TYPE_WHITESPACE)
TYPE_SIGNIFICANT_WHITESPACE =
INT2FIX(XML_READER_TYPE_SIGNIFICANT_WHITESPACE)
TYPE_END_ELEMENT =
INT2FIX(XML_READER_TYPE_END_ELEMENT)
TYPE_END_ENTITY =
INT2FIX(XML_READER_TYPE_END_ENTITY)
TYPE_XML_DECLARATION =
INT2FIX(XML_READER_TYPE_XML_DECLARATION)
MODE_INITIAL =

Read states

INT2FIX(XML_TEXTREADER_MODE_INITIAL)
MODE_INTERACTIVE =
INT2FIX(XML_TEXTREADER_MODE_INTERACTIVE)
MODE_ERROR =
INT2FIX(XML_TEXTREADER_MODE_ERROR)
MODE_EOF =
INT2FIX(XML_TEXTREADER_MODE_EOF)
MODE_CLOSED =
INT2FIX(XML_TEXTREADER_MODE_CLOSED)
MODE_READING =
INT2FIX(XML_TEXTREADER_MODE_READING)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.data(string, options = nil) ⇒ Object



23
24
25
26
# File 'lib/libxml/reader.rb', line 23

def self.data(string, options = nil)
  warn("XML::Reader.data is deprecated.  Use XML::Reader.string instead")
  self.string(string, options)
end

.XML::Reader.document(doc) ⇒ XML::Reader

Create an new reader for the specified document.

Returns:



88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'ext/libxml/ruby_xml_reader.c', line 88

VALUE rxml_reader_document(VALUE klass, VALUE doc)
{
  xmlDocPtr xdoc;
  xmlTextReaderPtr xreader;

  Data_Get_Struct(doc, xmlDoc, xdoc);

  xreader = xmlReaderWalker(xdoc);

  if (xreader == NULL)
    rxml_raise(&xmlLastError);

  return rxml_reader_wrap(xreader);
}

.XML::Reader.file(path) ⇒ XML::Reader .XML::Reader.file(path, : encoding) ⇒ XML::Encoding::UTF_8

Creates a new reader by parsing the specified file or uri.

You may provide an optional hash table to control how the parsing is performed. Valid options are:

encoding - The document encoding, defaults to nil. Valid values
           are the encoding constants defined on XML::Encoding.
options - Controls the execution of the parser, defaults to 0.
          Valid values are the constants defined on
          XML::Parser::Options.  Mutliple options can be combined
          by using Bitwise OR (|).

Overloads:



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
150
151
152
# File 'ext/libxml/ruby_xml_reader.c', line 120

static VALUE rxml_reader_file(int argc, VALUE *argv, VALUE klass)
{
  xmlTextReaderPtr xreader;
  VALUE path;
  VALUE options;

  const char *xencoding = NULL;
  int xoptions = 0;

  rb_scan_args(argc, argv, "11", &path, &options);
  Check_Type(path, T_STRING);

  if (!NIL_P(options))
  {
    VALUE encoding = Qnil;
    VALUE parserOptions = Qnil;

    Check_Type(options, T_HASH);

    encoding = rb_hash_aref(options, BASE_URI_SYMBOL);
    xencoding = NIL_P(encoding) ? NULL : xmlGetCharEncodingName(NUM2INT(encoding));

    parserOptions = rb_hash_aref(options, OPTIONS_SYMBOL);
    xoptions = NIL_P(parserOptions) ? 0 : NUM2INT(parserOptions);
  }

  xreader = xmlReaderForFile(StringValueCStr(path), xencoding, xoptions);

  if (xreader == NULL)
    rxml_raise(&xmlLastError);

  return rxml_reader_wrap(xreader);
}

.XML::Reader.io(io) ⇒ XML::Reader .XML::Reader.io(io, : encoding) ⇒ XML::Encoding::UTF_8

Creates a new reader by parsing the specified io object.

You may provide an optional hash table to control how the parsing is performed. Valid options are:

base_uri - The base url for the parsed document.
encoding - The document encoding, defaults to nil. Valid values
           are the encoding constants defined on XML::Encoding.
options - Controls the execution of the parser, defaults to 0.
          Valid values are the constants defined on
          XML::Parser::Options.  Mutliple options can be combined
          by using Bitwise OR (|).

Overloads:



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'ext/libxml/ruby_xml_reader.c', line 172

static VALUE rxml_reader_io(int argc, VALUE *argv, VALUE klass)
{
  xmlTextReaderPtr xreader;
  VALUE result;
  VALUE io;
  VALUE options;
  char *xbaseurl = NULL;
  const char *xencoding = NULL;
  int xoptions = 0;

  rb_scan_args(argc, argv, "11", &io, &options);

  if (!NIL_P(options))
  {
    VALUE baseurl = Qnil;
    VALUE encoding = Qnil;
    VALUE parserOptions = Qnil;

    Check_Type(options, T_HASH);

    baseurl = rb_hash_aref(options, BASE_URI_SYMBOL);
    xbaseurl = NIL_P(baseurl) ? NULL : StringValueCStr(baseurl);

    encoding = rb_hash_aref(options, ENCODING_SYMBOL);
    xencoding = NIL_P(encoding) ? NULL : xmlGetCharEncodingName(NUM2INT(encoding));

    parserOptions = rb_hash_aref(options, OPTIONS_SYMBOL);
    xoptions = NIL_P(parserOptions) ? 0 : NUM2INT(parserOptions);
  }
  
  xreader = xmlReaderForIO((xmlInputReadCallback) rxml_read_callback, NULL,
                           (void *) io, 
                           xbaseurl, xencoding, xoptions);

  if (xreader == NULL)
    rxml_raise(&xmlLastError);

  result = rxml_reader_wrap(xreader);

  /* Attach io object to parser so it won't get freed.*/
  rb_ivar_set(result, IO_ATTR, io);

  return result;
}

.XML::Reader.string(io) ⇒ XML::Reader .XML::Reader.string(io, : encoding) ⇒ XML::Encoding::UTF_8

Creates a new reader by parsing the specified string.

You may provide an optional hash table to control how the parsing is performed. Valid options are:

base_uri - The base url for the parsed document.
encoding - The document encoding, defaults to nil. Valid values
           are the encoding constants defined on XML::Encoding.
options - Controls the execution of the parser, defaults to 0.
          Valid values are the constants defined on
          XML::Parser::Options.  Mutliple options can be combined
          by using Bitwise OR (|).

Overloads:



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
268
269
270
271
272
# File 'ext/libxml/ruby_xml_reader.c', line 235

static VALUE rxml_reader_string(int argc, VALUE *argv, VALUE klass)
{
  xmlTextReaderPtr xreader;
  VALUE string;
  VALUE options;
  char *xbaseurl = NULL;
  const char *xencoding = NULL;
  int xoptions = 0;

  rb_scan_args(argc, argv, "11", &string, &options);
  Check_Type(string, T_STRING);

  if (!NIL_P(options))
  {
    VALUE baseurl = Qnil;
    VALUE encoding = Qnil;
    VALUE parserOptions = Qnil;

    Check_Type(options, T_HASH);

    baseurl = rb_hash_aref(options, BASE_URI_SYMBOL);
    xbaseurl = NIL_P(baseurl) ? NULL : StringValueCStr(baseurl);

    encoding = rb_hash_aref(options, ENCODING_SYMBOL);
    xencoding = NIL_P(encoding) ? NULL : xmlGetCharEncodingName(NUM2INT(encoding));
      
    parserOptions = rb_hash_aref(options, OPTIONS_SYMBOL);
    xoptions = NIL_P(parserOptions) ? 0 : NUM2INT(parserOptions);
  }
  
  xreader = xmlReaderForMemory(StringValueCStr(string), (int)RSTRING_LEN(string),
                               xbaseurl, xencoding, xoptions);

  if (xreader == NULL)
    rxml_raise(&xmlLastError);

  return rxml_reader_wrap(xreader);
}

.walker(doc) ⇒ Object

:enddoc:



18
19
20
21
# File 'lib/libxml/reader.rb', line 18

def self.walker(doc)
  warn("XML::Reader.walker is deprecated.  Use XML::Reader.document instead")
  self.document(doc)
end

Instance Method Details

#[](key) ⇒ Object

Provide the value of the attribute with the specified index (if key is an integer) or with the specified name (if key is a string) relative to the containing element, as a string.



879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
# File 'ext/libxml/ruby_xml_reader.c', line 879

static VALUE rxml_reader_attribute(VALUE self, VALUE key)
{
  VALUE result = Qnil;
  xmlChar *xattr;
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  if (TYPE(key) == T_FIXNUM)
  {
    xattr = xmlTextReaderGetAttributeNo(xReader, FIX2INT(key));
  }
  else
  {
    xattr = xmlTextReaderGetAttribute(xReader, (const xmlChar *) StringValueCStr(key));
  }

  if (xattr)
  {
    result = rxml_new_cstr(xattr, xencoding);
    xmlFree(xattr);
  }
  return result;
}

#attribute_countObject

Provide the number of attributes of the current node.



684
685
686
687
688
# File 'ext/libxml/ruby_xml_reader.c', line 684

static VALUE rxml_reader_attr_count(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderAttributeCount(xreader));
}

#base_uriObject

Determine the base URI of the node.



722
723
724
725
726
727
728
729
# File 'ext/libxml/ruby_xml_reader.c', line 722

static VALUE rxml_reader_base_uri(VALUE self)
{
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *result = xmlTextReaderConstBaseUri(xReader);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
}

#byte_consumedObject

This method provides the current index of the parser used by the reader, relative to the start of the current entity.



1032
1033
1034
1035
1036
1037
# File 'ext/libxml/ruby_xml_reader.c', line 1032

static VALUE
rxml_reader_byte_consumed(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2NUM(xmlTextReaderByteConsumed(xreader));
}

#closeObject

This method releases any resources allocated by the current instance changes the state to Closed and close any underlying input.



281
282
283
284
285
# File 'ext/libxml/ruby_xml_reader.c', line 281

static VALUE rxml_reader_close(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderClose(xreader));
}

#column_numberNumeric

Provide the column number of the current parsing point.

Returns:

  • (Numeric)


1047
1048
1049
1050
1051
1052
# File 'ext/libxml/ruby_xml_reader.c', line 1047

static VALUE
rxml_reader_column_number(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2NUM(xmlTextReaderGetParserColumnNumber(xreader));
}

#default?Boolean

Return whether an Attribute node was generated from the default value defined in the DTD or schema.

Returns:

  • (Boolean)


1075
1076
1077
1078
1079
# File 'ext/libxml/ruby_xml_reader.c', line 1075

static VALUE rxml_reader_default(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return xmlTextReaderIsDefault(xreader) ? Qtrue : Qfalse;
}

#depthObject

Get the depth of the node in the tree.



782
783
784
785
786
# File 'ext/libxml/ruby_xml_reader.c', line 782

static VALUE rxml_reader_depth(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderDepth(xreader));
}

#empty_element?Boolean

Check if the current node is empty.

Returns:

  • (Boolean)


1100
1101
1102
1103
1104
# File 'ext/libxml/ruby_xml_reader.c', line 1100

static VALUE rxml_reader_empty_element(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return xmlTextReaderIsEmptyElement(xreader) ? Qtrue : Qfalse;
}

#encodingXML::Encoding::UTF_8

Returns the encoding of the document being read. Note you first have to read data from the reader for encoding to return a value

reader = XML::Reader.file(XML_FILE)
assert_nil(reader.encoding)
reader.read
assert_equal(XML::Encoding::UTF_8, reader.encoding)

In addition, libxml always appears to return nil for the encoding when parsing strings.



706
707
708
709
710
711
712
713
714
# File 'ext/libxml/ruby_xml_reader.c', line 706

static VALUE rxml_reader_encoding(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xreader);
  if (xencoding)
    return INT2NUM(xmlParseCharEncoding((const char*)xencoding));
  else
    return INT2NUM(XML_CHAR_ENCODING_NONE);
}

#expandObject

Returns the current node and its full subtree. Note the returned node is valid ONLY until the next read call.



996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
# File 'ext/libxml/ruby_xml_reader.c', line 996

static VALUE rxml_reader_expand(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  xmlNodePtr xnode = NULL;

  /* At this point we need to wrap the reader's document as explained above. */
  xmlDocPtr xdoc = xmlTextReaderCurrentDoc(xreader);

  if (!xdoc)
    rb_raise(rb_eRuntimeError, "The reader does not have a document.  Did you forget to call read?");

  rxml_document_wrap(xdoc);

  /* And now hook in a mark function */
  RDATA(self)->dmark = (RUBY_DATA_FUNC)rxml_reader_mark;

  xnode = xmlTextReaderExpand(xreader);
  
  if (!xnode)
  {
    return Qnil;
  }
  else
  {
    return rxml_node_wrap(xnode);
  }
}

#get_attribute(localName) ⇒ Object

Provide the value of the attribute with the specified name relative to the containing element.



910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
# File 'ext/libxml/ruby_xml_reader.c', line 910

static VALUE rxml_reader_get_attribute(VALUE self, VALUE name)
{
  VALUE result = Qnil;
  xmlChar *xattr;
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  xattr = xmlTextReaderGetAttribute(xReader, (const xmlChar *) StringValueCStr(name));
  if (xattr)
  {
    result = rxml_new_cstr(xattr, xencoding);
    xmlFree(xattr);
  }
  return result;
}

#get_attribute_no(index) ⇒ Object

Provide the value of the attribute with the specified index relative to the containing element.



933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
# File 'ext/libxml/ruby_xml_reader.c', line 933

static VALUE rxml_reader_get_attribute_no(VALUE self, VALUE index)
{
  VALUE result = Qnil;
  xmlChar *xattr;
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  xattr = xmlTextReaderGetAttributeNo(xReader, FIX2INT(index));
  if (xattr)
  {
    result = rxml_new_cstr(xattr, xencoding);
    xmlFree(xattr);
  }
  return result;
}

#get_attribute_ns(name, ns) ⇒ Object



949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
# File 'ext/libxml/ruby_xml_reader.c', line 949

static VALUE rxml_reader_get_attribute_ns(VALUE self, VALUE name, VALUE ns)
{
  VALUE result = Qnil;
  xmlChar *xattr;
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  xattr = xmlTextReaderGetAttributeNs(xReader,
    (const xmlChar *) StringValueCStr(name),
    (const xmlChar *) StringValueCStr(ns));
  if (xattr)
  {
    result = rxml_new_cstr(xattr, xencoding);
    xmlFree(xattr);
  }
  return result;
}

#has_attributes?Boolean

Get whether the node has attributes.

Returns:

  • (Boolean)


853
854
855
856
857
# File 'ext/libxml/ruby_xml_reader.c', line 853

static VALUE rxml_reader_has_attributes(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return xmlTextReaderHasAttributes(xreader) ? Qtrue : Qfalse;
}

#has_value?Boolean

Get whether the node can have a text value.

Returns:

  • (Boolean)


865
866
867
868
869
# File 'ext/libxml/ruby_xml_reader.c', line 865

static VALUE rxml_reader_has_value(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return xmlTextReaderHasValue(xreader) ? Qtrue : Qfalse;
}

#line_numberNumeric

Provide the line number of the current parsing point.

Returns:

  • (Numeric)


1060
1061
1062
1063
1064
1065
# File 'ext/libxml/ruby_xml_reader.c', line 1060

static VALUE
rxml_reader_line_number(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2NUM(xmlTextReaderGetParserLineNumber(xreader));
}

#local_nameObject

Return the local name of the node.



669
670
671
672
673
674
675
676
# File 'ext/libxml/ruby_xml_reader.c', line 669

static VALUE rxml_reader_local_name(VALUE self)
{
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *result = xmlTextReaderConstLocalName(xReader);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
}

#lookup_namespace(prefix) ⇒ Object

Resolve a namespace prefix in the scope of the current element. To return the default namespace, specify nil as prefix.



974
975
976
977
978
979
980
981
982
983
984
985
986
987
# File 'ext/libxml/ruby_xml_reader.c', line 974

static VALUE rxml_reader_lookup_namespace(VALUE self, VALUE prefix)
{
  VALUE result = Qnil;
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *xnamespace = xmlTextReaderLookupNamespace(xReader, (const xmlChar *) StringValueCStr(prefix));
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  if (xnamespace)
  {
    result = rxml_new_cstr(xnamespace, xencoding);
    xmlFree((void *)xnamespace);
  }
  return result;
}

#move_to_attribute(localName) ⇒ Object

Move the position of the current instance to the attribute with the specified name relative to the containing element.



312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
# File 'ext/libxml/ruby_xml_reader.c', line 312

static VALUE rxml_reader_move_to_attr(VALUE self, VALUE val)
{
  if (TYPE(val) == T_FIXNUM)
  {
    rb_warn("%s::move_to_attribute with a Fixnum argument is deprecated. "
      "Please, consider move_to_attribute_no method instead.",
      rb_class2name(cXMLReader));
    return rxml_reader_move_to_attr_no(self, val);
  }
  else
  {
    int ret;
    xmlTextReaderPtr xreader;

    xreader = rxml_text_reader_get(self);
    ret = xmlTextReaderMoveToAttribute(xreader,
        (const xmlChar *) StringValueCStr(val));

    return INT2FIX(ret);
  }
}

#move_to_attribute_no(index) ⇒ Object

Move the position of the current instance to the attribute with the specified index relative to the containing element.



294
295
296
297
298
299
300
301
302
303
# File 'ext/libxml/ruby_xml_reader.c', line 294

static VALUE rxml_reader_move_to_attr_no(VALUE self, VALUE index)
{
  int ret;
  xmlTextReaderPtr xreader;

  xreader = rxml_text_reader_get(self);
  ret = xmlTextReaderMoveToAttributeNo(xreader, FIX2INT(index));

  return INT2FIX(ret);
}

#move_to_attribute_ns(localName, namespaceURI) ⇒ Object

Move the position of the current instance to the attribute with the specified name and namespace relative to the containing element.



341
342
343
344
345
346
347
348
349
350
351
352
# File 'ext/libxml/ruby_xml_reader.c', line 341

static VALUE rxml_reader_move_to_attr_ns(VALUE self, VALUE name, VALUE ns)
{
  int ret;
  xmlTextReaderPtr xreader;

  xreader = rxml_text_reader_get(self);
  ret = xmlTextReaderMoveToAttributeNs(xreader,
      (const xmlChar *) StringValueCStr(name),
      (const xmlChar *) StringValueCStr(ns));

  return INT2FIX(ret);
}

#move_to_elementObject

Move the position of the current instance to the node that contains the current attribute node.



387
388
389
390
391
# File 'ext/libxml/ruby_xml_reader.c', line 387

static VALUE rxml_reader_move_to_element(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderMoveToElement(xreader));
}

#move_to_first_attributeObject

Move the position of the current instance to the first attribute associated with the current node.



361
362
363
364
365
# File 'ext/libxml/ruby_xml_reader.c', line 361

static VALUE rxml_reader_move_to_first_attr(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderMoveToFirstAttribute(xreader));
}

#move_to_next_attributeObject

Move the position of the current instance to the next attribute associated with the current node.



374
375
376
377
378
# File 'ext/libxml/ruby_xml_reader.c', line 374

static VALUE rxml_reader_move_to_next_attr(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderMoveToNextAttribute(xreader));
}

#nameObject

Return the qualified name of the node.



654
655
656
657
658
659
660
661
# File 'ext/libxml/ruby_xml_reader.c', line 654

static VALUE rxml_reader_name(VALUE self)
{
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *result = xmlTextReaderConstName(xReader);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
}

#namespace_declaration?Boolean

Determine whether the current node is a namespace declaration rather than a regular attribute.

Returns:

  • (Boolean)


1088
1089
1090
1091
1092
# File 'ext/libxml/ruby_xml_reader.c', line 1088

static VALUE rxml_reader_namespace_declaration(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return xmlTextReaderIsNamespaceDecl(xreader) ? Qtrue : Qfalse;
}

#namespace_uriObject

Determine the namespace URI of the node.



737
738
739
740
741
742
743
744
# File 'ext/libxml/ruby_xml_reader.c', line 737

static VALUE rxml_reader_namespace_uri(VALUE self)
{
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *result = xmlTextReaderConstNamespaceUri(xReader);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
}

#nextObject

Skip to the node following the current one in document order while avoiding the subtree if any.



400
401
402
403
404
# File 'ext/libxml/ruby_xml_reader.c', line 400

static VALUE rxml_reader_next(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderNext(xreader));
}

#next_siblingObject

Skip to the node following the current one in document order while avoiding the subtree if any. Currently implemented only for Readers built on a document.



414
415
416
417
418
# File 'ext/libxml/ruby_xml_reader.c', line 414

static VALUE rxml_reader_next_sibling(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderNextSibling(xreader));
}

#nodeXML::Node

Returns the reader’s current node. It will return nil if Reader#read has not yet been called. WARNING - Using this method is dangerous because the the node may be destroyed on the next #read.

Returns:



429
430
431
432
433
434
# File 'ext/libxml/ruby_xml_reader.c', line 429

static VALUE rxml_reader_node(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  xmlNodePtr xnode = xmlTextReaderCurrentNode(xreader);
  return xnode ? rxml_node_wrap(xnode) : Qnil;
}

#node_typeObject

Get the node type of the current node. Reference: dotgnu.org/pnetlib-doc/System/Xml/XmlNodeType.html



443
444
445
446
447
# File 'ext/libxml/ruby_xml_reader.c', line 443

static VALUE rxml_reader_node_type(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderNodeType(xreader));
}

#normalizationObject

The value indicating whether to normalize white space and attribute values. Since attribute value and end of line normalizations are a MUST in the XML specification only the value true is accepted. The broken bahaviour of accepting out of range character entities like &#0; is of course not supported either.

Return 1 or -1 in case of error.



461
462
463
464
465
# File 'ext/libxml/ruby_xml_reader.c', line 461

static VALUE rxml_reader_normalization(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderNormalization(xreader));
}

#prefixObject

Get a shorthand reference to the namespace associated with the node.



767
768
769
770
771
772
773
774
# File 'ext/libxml/ruby_xml_reader.c', line 767

static VALUE rxml_reader_prefix(VALUE self)
{
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *result = xmlTextReaderConstPrefix(xReader);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
}

#quote_charString

Get the quotation mark character used to enclose the value of an attribute, as an integer value (and -1 in case of error).

Returns:

  • (String)


795
796
797
798
799
# File 'ext/libxml/ruby_xml_reader.c', line 795

static VALUE rxml_reader_quote_char(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderQuoteChar(xreader));
}

#readObject

Causes the reader to move to the next node in the stream, exposing its properties.

Returns true if a node was successfully read or false if there are no more nodes to read. On errors, an exception is raised.



475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# File 'ext/libxml/ruby_xml_reader.c', line 475

static VALUE rxml_reader_read(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  int result = xmlTextReaderRead(xreader);
  switch(result)
  {
    case -1:
      rxml_raise(&xmlLastError);
      return Qnil;
      break;
    case 0:
      return Qfalse;
    case 1:
      return Qtrue;
    default:
      rb_raise(rb_eRuntimeError,
               "xmlTextReaderRead did not return -1, 0 or 1.  Return value was: %d", result);
  }
}

#read_attribute_valueObject

Parse an attribute value into one or more Text and EntityReference nodes.

Return 1 in case of success, 0 if the reader was not positionned on an attribute node or all the attribute values have been read, or -1 in case of error.



505
506
507
508
509
# File 'ext/libxml/ruby_xml_reader.c', line 505

static VALUE rxml_reader_read_attr_value(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderReadAttributeValue(xreader));
}

#read_inner_xmlObject

Read the contents of the current node, including child nodes and markup.

Return a string containing the XML content, or nil if the current node is neither an element nor attribute, or has no child nodes.



520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
# File 'ext/libxml/ruby_xml_reader.c', line 520

static VALUE rxml_reader_read_inner_xml(VALUE self)
{
  VALUE result = Qnil;
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);

  xmlChar *xml = xmlTextReaderReadInnerXml(xReader);

  if (xml)
  {
    const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
    result = rxml_new_cstr( xml, xencoding);
    xmlFree(xml);
  }

  return result;
}

#read_outer_xmlObject

Read the contents of the current node, including child nodes and markup.

Return a string containing the XML content, or nil if the current node is neither an element nor attribute, or has no child nodes.



546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
# File 'ext/libxml/ruby_xml_reader.c', line 546

static VALUE rxml_reader_read_outer_xml(VALUE self)
{
  VALUE result = Qnil;
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);

  xmlChar *xml = xmlTextReaderReadOuterXml(xReader);

  if (xml)
  {
    const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
    result = rxml_new_cstr( xml, xencoding);
    xmlFree(xml);
  }

  return result;
}

#read_stateObject

Get the read state of the reader.



569
570
571
572
573
# File 'ext/libxml/ruby_xml_reader.c', line 569

static VALUE rxml_reader_read_state(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderReadState(xreader));
}

#read_stringString

Read the contents of an element or a text node as a string.

Return a string containing the contents of the Element or Text node, or nil if the reader is positioned on any other type of node.

Returns:

  • (String)


584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
# File 'ext/libxml/ruby_xml_reader.c', line 584

static VALUE rxml_reader_read_string(VALUE self)
{
  VALUE result = Qnil;
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);

  xmlChar *xml = xmlTextReaderReadString(xReader);

  if (xml)
  {
    const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
    result = rxml_new_cstr( xml, xencoding);
    xmlFree(xml);
  }

  return result;
}

#relax_ng_validate(rng) ⇒ Boolean

Use RelaxNG to validate the document as it is processed. Activation is only possible before the first read. If rng is nil, the RelaxNG validation is desactivated.

Return true in case the RelaxNG validation could be (des)activated and false in case of error.

Returns:

  • (Boolean)


612
613
614
615
616
617
618
619
620
621
# File 'ext/libxml/ruby_xml_reader.c', line 612

static VALUE rxml_reader_relax_ng_validate(VALUE self, VALUE rng)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  xmlRelaxNGPtr xrelax;
  int status;
  Data_Get_Struct(rng, xmlRelaxNG, xrelax);
  
  status = xmlTextReaderRelaxNGSetSchema(xreader, xrelax);
  return (status == 0 ? Qtrue : Qfalse);
}

#reset_error_handlerObject



6
7
8
9
# File 'lib/libxml/reader.rb', line 6

def reset_error_handler
  warn('reset_error_handler is deprecated.  Use Error.reset_handler instead')
  Error.reset_handler
end

#schema_validate(schema) ⇒ Boolean

Use W3C XSD schema to validate the document as it is processed. Activation is only possible before the first read. If schema is nil, then XML Schema validation is deactivated.

Return false if if the schema’s validation could be (de)activated and true otherwise.

Returns:

  • (Boolean)


635
636
637
638
639
640
641
642
643
644
645
# File 'ext/libxml/ruby_xml_reader.c', line 635

static VALUE
rxml_reader_schema_validate(VALUE self, VALUE xsd)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  xmlSchemaPtr xschema;
  int status;

  Data_Get_Struct(xsd, xmlSchema, xschema);
  status = xmlTextReaderSetSchema(xreader, xschema);
  return (status == 0 ? Qtrue : Qfalse);
}

#set_error_handler(&block) ⇒ Object



11
12
13
14
# File 'lib/libxml/reader.rb', line 11

def set_error_handler(&block)
  warn('set_error_handler is deprecated.  Use Error.set_handler instead')
  Error.set_handler(&block)
end

#standaloneObject

Determine the standalone status of the document being read.

Return 1 if the document was declared to be standalone, 0 if it was declared to be not standalone, or -1 if the document did not specify its standalone status or in case of error.



811
812
813
814
815
# File 'ext/libxml/ruby_xml_reader.c', line 811

static VALUE rxml_reader_standalone(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return INT2FIX(xmlTextReaderStandalone(xreader));
}

#valid?Boolean

Retrieve the validity status from the parser context.

Returns:

  • (Boolean)


1112
1113
1114
1115
1116
# File 'ext/libxml/ruby_xml_reader.c', line 1112

static VALUE rxml_reader_valid(VALUE self)
{
  xmlTextReaderPtr xreader = rxml_text_reader_get(self);
  return xmlTextReaderIsValid(xreader) ? Qtrue : Qfalse;
}

#valueObject

Provide the text value of the node if present.



752
753
754
755
756
757
758
759
# File 'ext/libxml/ruby_xml_reader.c', line 752

static VALUE rxml_reader_value(VALUE self)
{
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *result = xmlTextReaderConstValue(xReader);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
}

#xml_langObject

Get the xml:lang scope within which the node resides.



823
824
825
826
827
828
829
830
# File 'ext/libxml/ruby_xml_reader.c', line 823

static VALUE rxml_reader_xml_lang(VALUE self)
{
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *result = xmlTextReaderConstXmlLang(xReader);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
}

#xml_versionObject

Determine the XML version of the document being read.



838
839
840
841
842
843
844
845
# File 'ext/libxml/ruby_xml_reader.c', line 838

static VALUE rxml_reader_xml_version(VALUE self)
{
  xmlTextReaderPtr xReader = rxml_text_reader_get(self);
  const xmlChar *result = xmlTextReaderConstXmlVersion(xReader);
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);

  return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
}