Basic XML to nested Array

  • Thread starter James Jhfghgfhgf
  • Start date
J

James Jhfghgfhgf

Hey,

I've been having some trouble getting to grips with the various XML
libraries, I just want to put together a ruby script that will convert a
basic XML file into a nested array then just output that array to the
console.

The XML looks like this:
<vector>
<point>
<x>1018.550659</x>
<y>558.138367</y>
<z>102.505821</z>
</point>
<point>
<x>1013.557495</x>
<y>560.874878</y>
<z>107.041840</z>
</point>
<point>
<x>1008.563049</x>
<y>563.611267</y>
<z>111.577576</z>
</point>
</vector>
<vector>
<point>
<x>1030.809204</x>
<y>551.722961</y>
<z>86.581741</z>
</point>
<point>
<x>1027.500854</x>
<y>553.190613</y>
<z>95.061058</z>
</point>
</vector>

and I want to make it this:
[[[1018.550659],[558.138367],[102.505821]],[[1013.557495],[560.874878],[107.041840]],[[1008.563049],[563.611267],[111.577576]]],[[[1030.809204],[551.722961],[86.581741]],[[1027.500854],[553.190613],[95.061058]]]

Anyone know the best way to go about this?

Thanks very much!
 
H

Heesob Park

Hi,

2009/8/6 James Jhfghgfhgf said:
Hey,

I've been having some trouble getting to grips with the various XML
libraries, I just want to put together a ruby script that will convert a
basic XML file into a nested array then just output that array to the
console.

The XML looks like this:
<vector>
=C2=A0<point>
=C2=A0 =C2=A0 =C2=A0<x>1018.550659</x>
=C2=A0 =C2=A0 =C2=A0<y>558.138367</y>
=C2=A0 =C2=A0 =C2=A0<z>102.505821</z>
=C2=A0</point>
=C2=A0<point>
=C2=A0 =C2=A0 =C2=A0<x>1013.557495</x>
=C2=A0 =C2=A0 =C2=A0<y>560.874878</y>
=C2=A0 =C2=A0 =C2=A0<z>107.041840</z>
=C2=A0</point>
=C2=A0<point>
=C2=A0 =C2=A0 =C2=A0<x>1008.563049</x>
=C2=A0 =C2=A0 =C2=A0<y>563.611267</y>
=C2=A0 =C2=A0 =C2=A0<z>111.577576</z>
=C2=A0</point>
</vector>
<vector>
=C2=A0<point>
=C2=A0 =C2=A0 =C2=A0<x>1030.809204</x>
=C2=A0 =C2=A0 =C2=A0<y>551.722961</y>
=C2=A0 =C2=A0 =C2=A0<z>86.581741</z>
=C2=A0</point>
=C2=A0<point>
=C2=A0 =C2=A0 =C2=A0<x>1027.500854</x>
=C2=A0 =C2=A0 =C2=A0<y>553.190613</y>
=C2=A0 =C2=A0 =C2=A0<z>95.061058</z>
=C2=A0</point>
</vector>

and I want to make it this:
[[[1018.550659],[558.138367],[102.505821]],[[1013.557495],[560.874878],[1= 07.041840]],[[1008.563049],[563.611267],[111.577576]]],[[[1030.809204],[551=
722961],[86.581741]],[[1027.500854],[553.190613],[95.061058]]]

Anyone know the best way to go about this?
Your xml file is missing the root element.
If your xml file is 'a.xml', you can do something like this:

require 'rexml/document'
doc =3D REXML::Document.new("<root>"+File.read("a.xml")+"</root>")
res =3D doc.elements.to_a("/*/*").map{|e1|
e1.elements.to_a.map{|e2|e2.elements.to_a.map{|e3|e3.text}}
}
p res


Regards,

Park Heesob
 
J

James Jhfghgfhgf

Yeah the program outputting this stuff doesn't add a root element so
great tip there, it worked perfectly thanks Heesob!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top