Forum: Ruby on Rails XML::LibXML::Reader

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
1be02c83462a5b55ff254899be893d2d?d=identicon&s=25 lecielbleu (Guest)
on 2009-06-02 09:43
(Received via mailing list)
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')
        .
        .
        .
96146b7a23174e2e024c06a49f845bb8?d=identicon&s=25 Jeffrey L. Taylor (Guest)
on 2009-06-02 18:10
(Received via mailing list)
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
1be02c83462a5b55ff254899be893d2d?d=identicon&s=25 lecielbleu (Guest)
on 2009-06-03 10:37
(Received via mailing list)
i tried this an get an error =
NoMemoryError
failed to allocate memory
error line number 30 =    stack << reader.name
96146b7a23174e2e024c06a49f845bb8?d=identicon&s=25 Jeffrey L. Taylor (Guest)
on 2009-06-03 14:34
(Received via mailing list)
Have not seen this error before.  Please show more of your code.

Jeffrey

Quoting lecielbleu <canali83@gmail.com>:
1be02c83462a5b55ff254899be893d2d?d=identicon&s=25 lecielbleu (Guest)
on 2009-06-03 15:14
(Received via mailing list)
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
96146b7a23174e2e024c06a49f845bb8?d=identicon&s=25 Jeffrey L. Taylor (Guest)
on 2009-06-03 23:49
(Received via mailing list)
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>:
>     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('/')}"
1be02c83462a5b55ff254899be893d2d?d=identicon&s=25 lecielbleu (Guest)
on 2009-06-04 11:52
(Received via mailing list)
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.
1be02c83462a5b55ff254899be893d2d?d=identicon&s=25 lecielbleu (Guest)
on 2009-06-04 11:57
(Received via mailing list)
i tried also
while doc == true
while doc = 1
while doc

results dont change....
96146b7a23174e2e024c06a49f845bb8?d=identicon&s=25 Jeffrey L. Taylor (Guest)
on 2009-06-04 20:37
(Received via mailing list)
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>:
1be02c83462a5b55ff254899be893d2d?d=identicon&s=25 lecielbleu (Guest)
on 2009-06-07 19:49
(Received via mailing list)
ok Jeff i solved problem , using "doc" was a bad mistake :) 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

----------------------------

now i have to solve another problem :) do you know how can i get a
brand_name using filter brand_id

    while reader.read
      case reader.read_string
        when 55
                               -------magic line i couldnt find :)
----------
      end
    end

magic line must be get brand_name value "Dell" using "55"

Sample xml code ===>>  <Brand><Brand_id>55</Brand_id><Brand_name>Dell</
Brand_name></Brand>
96146b7a23174e2e024c06a49f845bb8?d=identicon&s=25 Jeffrey L. Taylor (Guest)
on 2009-06-08 16:55
(Received via mailing list)
Glad it is working.

Jeff

Quoting lecielbleu <canali83@gmail.com>:
This topic is locked and can not be replied to.