From: <pau...@us...> - 2007-03-18 13:30:50
|
Revision: 940 http://svn.sourceforge.net/everydevel/?rev=940&view=rev Author: paul_the_nomad Date: 2007-03-16 17:27:13 -0700 (Fri, 16 Mar 2007) Log Message: ----------- XML::Node single node xml parsing to extract node data and tests. Modified Paths: -------------- trunk/ebase/lib/Everything/XML/Node.pm trunk/ebase/lib/Everything/XML/Test/Node.pm Property Changed: ---------------- trunk/ebase/ Property changes on: trunk/ebase ___________________________________________________________________ Name: svk:merge - 16c2b9cb-492b-4d64-9535-64d4e875048d:/wip/ebase:946 a6810612-c0f9-0310-9d3e-a9e4af8c5745:/ebase/offline:17930 + 16c2b9cb-492b-4d64-9535-64d4e875048d:/wip/ebase:947 a6810612-c0f9-0310-9d3e-a9e4af8c5745:/ebase/offline:17930 Modified: trunk/ebase/lib/Everything/XML/Node.pm =================================================================== --- trunk/ebase/lib/Everything/XML/Node.pm 2007-03-17 00:26:50 UTC (rev 939) +++ trunk/ebase/lib/Everything/XML/Node.pm 2007-03-17 00:27:13 UTC (rev 940) @@ -9,11 +9,42 @@ { use Object::InsideOut; + + my @title + :Field + :Standard(title) + :Arg(title); + + my @nodetype + :Field + :Standard(nodetype) + :Arg(nodetype); + + my @export_version + :Field + :Standard(export_version) + :Arg(export_version); + my @node :Field :Standard(node) :Arg(node); + my @attributes + :Field + :Standard(attributes) + :Arg(attributes); + + my @vars + :Field + :Standard(vars) + :Arg(vars); + + my @group_members + :Field + :Standard(group_members) + :Arg(group_members); + my @nodebase :Field :Standard(nodebase) @@ -21,6 +52,9 @@ } +use XML::DOM; +use strict; +use warnings; =head2 C<fieldToXML_vars> @@ -368,4 +402,190 @@ } +sub parse_xml { + my ( $self, $xml ) = @_; + my $XMLPARSER = XML::DOM::Parser->new( + ErrorContext => 2, + ProtocolEncoding => 'ISO-8859-1' + ); + + my $doc = $XMLPARSER->parse("<everything>\n$xml\n</everything>"); + + my @nodes = $doc->getElementsByTagName("NODE"); + + foreach my $node (@nodes) { + + $self->set_title( $node->getAttribute("title") ); + $self->set_nodetype( $node->getAttribute("nodetype") ); + $self->set_export_version( $node->getAttribute("export_version")); + + my @list = $node->getElementsByTagName("field"); + + my @fields; + + foreach my $field ( @list ) { + + my $atts = $field->getAttributes; # returns a NamedNodeMap + my $name = $atts->getNamedItem('name')->getValue; + my $type = $atts->getNamedItem('type')->getValue; + my $type_nodetype = $atts->getNamedItem('type_nodetype'); + $type_nodetype = $type_nodetype->getValue if $type_nodetype; + + + ## should be only one childNode that is a text node + my @contents = $field->getChildNodes; + + my $text; + $text .= $_->getData foreach @contents; + + my $node_attribute = Everything::XML::Node::Attribute->new; + $node_attribute->set_name( $name ); + $node_attribute->set_type( $type ); + $node_attribute->set_type_nodetype( $type_nodetype ) if $type_nodetype; + $node_attribute->set_content( $text ); + + push @fields, $node_attribute; + } + + $self->set_attributes( \@fields ); + + + @list = $node->getElementsByTagName("var"); + + my @vars; + + foreach my $var ( @list ) { + + my $atts = $var->getAttributes; # returns a NamedNodeMap + my $name = $atts->getNamedItem('name')->getValue; + my $type = $atts->getNamedItem('type')->getValue; + my $type_nodetype = $atts->getNamedItem('type_nodetype'); + $type_nodetype = $type_nodetype->getValue if $type_nodetype; + + + ## should be only one childNode that is a text node + my @contents = $var->getChildNodes; + + my $text; + $text .= $_->getData foreach @contents; + + my $node_vars = Everything::XML::Node::Attribute->new; + $node_vars->set_name( $name ); + $node_vars->set_type( $type ); + $node_vars->set_type_nodetype( $type_nodetype ) if $type_nodetype; + $node_vars->set_content( $text ); + push @vars, $node_vars; + } + + $self->set_vars( \@vars ); + + + @list = $node->getElementsByTagName("member"); + + my @members; + + foreach my $member ( @list ) { + + my $atts = $member->getAttributes; # returns a NamedNodeMap + my $name = $atts->getNamedItem('name')->getValue; + my $type = $atts->getNamedItem('type')->getValue; + my $type_nodetype = $atts->getNamedItem('type_nodetype'); + $type_nodetype = $type_nodetype->getValue if $type_nodetype; + + + ## should be only one childNode that is a text node + my @contents = $member->getChildNodes; + + my $text; + $text .= $_->getData foreach @contents; + + my $group_member = Everything::XML::Node::Attribute->new; + + + $group_member->set_name( $text ); + $group_member->set_type( $type ); + $group_member->set_type_nodetype( $type_nodetype ) if $type_nodetype; + + push @members, $group_member; + } + + $self->set_group_members( \@members ); + + } + return $self; + +} + +package Everything::XML::Node::Attribute; + +{ + use Object::InsideOut; + + my @name + :Field + :Standard(name); + + my @content + :Field + :Standard(content); + + my @type_nodetype + :Field + :Standard(type_nodetype); + + my @type + :Field + :Standard(type); + +} + + +=head2 C<parse_xml> + +This method takes an XML string representing one node. It returns the instance itself. + +Onced parsed, the node attributes can be retrieved thusly: + +=over 8 + +=item * get_title + +=item * get_nodetype + +=item * get_exportversion + +=back + +The attribtutes, vars and group members can be retrieved like this: + +=over 8 + +=item * get_attributes + +=item * get_vars + +=item * get_group_members + +=back + +Each of these returns an array ref of Everything::XML::Node::Attribute objects. Everything::XML::Node::Attribute objects support the following methods: + + +=over 8 + +=item * get_name + +=item * get_type + +=item * get_type_nodetype + +=item * get_content + +=back + +That way we can parse XML files purporting to be nodes and extract the information therein. + +=cut + + 1; Modified: trunk/ebase/lib/Everything/XML/Test/Node.pm =================================================================== --- trunk/ebase/lib/Everything/XML/Test/Node.pm 2007-03-17 00:26:50 UTC (rev 939) +++ trunk/ebase/lib/Everything/XML/Test/Node.pm 2007-03-17 00:27:13 UTC (rev 940) @@ -290,6 +290,53 @@ ); } +sub test_a_parse_xml : Test( 12 ) { + my $self = shift; + can_ok( $self->{class}, 'parse_xml' ) || return; + my $instance = $self->{instance}; + my $mock = Test::MockObject->new; + + my $xml = '<NODE title="a test node" nodetype="supertype" export_version="1000"><field name="a field name" type="literal_value">blah</field><vars><var name="default_theme" type="noderef" type_nodetype="theme,nodetype">default theme</var></vars><group><member name="group_node" type="noderef" type_nodetype="restricted_superdoc,nodetype">Everything settings</member></group></NODE>'; + + ok( $instance->parse_xml($xml), '...parses the XML'); + my $fields = $instance->get_attributes; + my $vars = $instance->get_vars; + my $group_members = $instance->get_group_members; + + is ($instance->get_title, 'a test node', '...with a node title.'); + is ($instance->get_nodetype, 'supertype', '...with a node type.'); + is ($instance->get_export_version, 1000, '...with an export version.'); + + foreach (@$fields) { + my $field_name = $_->get_name; + my $field_content = $_->get_content; + my $field_type = $_->get_type; + my $field_type_nodetype = $_->get_type_nodetype; + is($field_name, 'a field name', '...one field with field name.'); + is ($field_content, 'blah', '...with the correct content'); + } + + foreach (@$vars) { + my $var_name = $_->get_name; + my $var_content = $_->get_content; + my $var_type = $_->get_type; + my $var_type_nodetype = $_->get_type_nodetype; + is($var_name, 'default_theme', '...one field with field name.'); + is ($var_content, 'default theme', '...with the correct content'); + } + + + foreach (@$group_members) { + my $member_name = $_->get_name; + my $member_type = $_->get_type; + my $member_type_nodetype = $_->get_type_nodetype; + is($member_name, 'Everything settings', '...one field with field name.'); + is ($member_type_nodetype, 'restricted_superdoc,nodetype', '...with the correct content'); + is($member_type, 'noderef', '...groups nodes are always noderefs.'); + } + +} + sub test_to_xml : Test(4) { my $self = shift; can_ok( $self->{class}, 'toXML' ) || return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |