XML::LibXML::Reader

is there anybody who knows how we can get child values using libxml (Reader class)

  def xml_import_to_brands     require'xml'     reader = XML::Reader.file('c:/brands.xml')         .         .         .

Quoting lecielbleu <canali83@gmail.com>:

is there anybody who knows how we can get child values using libxml (Reader class)

  def xml_import_to_brands     require'xml'     reader = XML::Reader.file('c:/brands.xml')         .

For docs, go to http://libxml.rubyforge.org/rdoc/index.html, scroll down in middle, left windows to LibXML::XML::Reader.

Something along the lines of:

require 'xml'

stack = while reader   case reader.node_type   when XML::Reader::TYPE_ELEMENT     # opening tag     stack << reader.name     stack.pop if reader.empty_element?   when XML::Reader::TYPE_TEXT, XML::Reader::TYPE_CDATA     path = stack.join('/')     case path     when 'root/parent/child'       puts reader.value # simple content     when 'root/parent/complex_content'       puts reader.read_inner_xml # contents including markup   when XML::Reader::TYPE_END_ELEMENT     # closing tag     stack.pop   end end

HTH,   Jeffrey

i tried this an get an error = NoMemoryError failed to allocate memory error line number 30 = stack << reader.name

Have not seen this error before. Please show more of your code.

Jeffrey

Quoting lecielbleu <canali83@gmail.com>:

my xml data seems like that : <Brands><Brand><Brand_id>2</ Brand_id><Brand_name>HP</Brand_name></Brand> and here is my codes

def xml_testing     require'xml'     reader = XML::Reader.file('c:/brands.xml')

    stack =     while reader       case reader.node_type       when XML::Reader::TYPE_ELEMENT         # opening tag         stack << reader.name         stack.pop if reader.empty_element?       when XML::Reader::TYPE_TEXT, XML::Reader::TYPE_CDATA         path = stack.join('/')         case path         when 'Brands/Brand/Brand_name'           puts reader.value # simple content        when XML::Reader::TYPE_END_ELEMENT         # closing tag         stack.pop       end     end     end

    flash.now[:message]="brands read"   end

Note : i add one more "end" cause it was saying unexpected end

There are no <xml> header tags. I have no idea how libXML will behave. It isn't very tolerant of invalid input. Try adding the puts statements I've inserted below to find out how far it is getting.

Quoting lecielbleu <canali83@gmail.com>:

my xml data seems like that : <Brands><Brand><Brand_id>2</ Brand_id><Brand_name>HP</Brand_name></Brand> and here is my codes

def xml_testing     require'xml'     reader = XML::Reader.file('c:/brands.xml')

    stack =     while reader       case reader.node_type       when XML::Reader::TYPE_ELEMENT         # opening tag         stack << reader.name

                    puts "BEGIN #{stack.join('/')}"

        stack.pop if reader.empty_element?

                    puts "END #{stack.join('/')}" if reader.empty_element?

      when XML::Reader::TYPE_TEXT, XML::Reader::TYPE_CDATA         path = stack.join('/')         case path         when 'Brands/Brand/Brand_name'           puts reader.value # simple content        when XML::Reader::TYPE_END_ELEMENT         # closing tag

                    puts "END #{stack.join('/')}"

i guess problem is while reader line because when i run basic code below :

while doc == true       puts reader.read_string     end

strings never stops in the command line , it turns infinite loop.

i tried also while doc == true while doc = 1 while doc

results dont change....

I'm afraid I don't understand what you are trying to do here. 'doc' isn't in the example below. So how the loop would change its value, I am unclear. It seems like you are saying a loop with an unchanging condition runs forever. Yes, it does.

Did you intend to do this:

while reader.read   puts reader.read_string end

HTH   Jeff

Quoting lecielbleu <canali83@gmail.com>:

ok Jeff i solved problem , using "doc" was a bad mistake :slight_smile: thanks for your support ,here is the last codes

    while reader.read       case reader.name         when "Brand_name"         name_from_xml = reader.read_string         Brand.create( :name => name_from_xml )       end     end

Glad it is working.

Jeff

Quoting lecielbleu <canali83@gmail.com>: