XML/Output

From Rosetta Code
< XML
Revision as of 15:05, 5 June 2009 by rosettacode>Glennj (add Ruby)
Task
XML/Output
You are encouraged to solve this task according to the task description, using any language you may know.

Create an XML document that consists of a top-level Students element containing a sequence of Student elements. Each Student node must be empty, and must have a Name attribute. The sequence of names of students must be “April”, “Bob”, “Chad”, “Dave” and “Emily”; these must be made into five Student elements.

Sample acceptable output:

<Students>
  <Student Name="April" />
  <Student Name="Bob" />
  <Student Name="Chad" />
  <Student Name="Dave" />
  <Student Name="Emily" />
</Students>

The document may include an <?xml?> declaration and document type declaration, but these are optional. If attempting this task by direct string manipulation, the implementation must include code to perform entity substitution for the characters that have entities defined in the XML 1.0 specification.

C

Library: libXML

<lang c>#include <stdio.h>

  1. include <stdlib.h>
  2. include <string.h>
  3. include <libxml/parser.h>
  4. include <libxml/tree.h>

char *names[] = {

 "April", "Bob", "Chad", "Dave", "Emily", NULL

};

int main() {

 xmlDoc *doc = NULL;
 xmlNode *root = NULL, *node;
 char **next;
 doc = xmlNewDoc("1.0");
 root = xmlNewNode(NULL, "Students");
 xmlDocSetRootElement(doc, root);
 for(next = names; *next != NULL; next++) {
   node = xmlNewNode(NULL, "Student");
   (void)xmlNewProp(node, "Name", *next);
   xmlAddChild(root, node);
 }
 xmlElemDump(stdout, doc, root);
 xmlFreeDoc(doc);
 xmlCleanupParser();
 
 return EXIT_SUCCESS;

}</lang>

OCaml

<lang ocaml>

  1. #directory "+site-lib/xml-light" (* or maybe just "+xml-light" *) ;;
  1. #load "xml-light.cma" ;;
  1. let students = ["April"; "Bob"; "Chad"; "Dave"; "Emily"] in
 let tags_students = List.map (fun name ->
     Xml.Element ("Student", [("Name", name)], [])
   ) students in
 print_endline (
   Xml.to_string_fmt (Xml.Element ("Students", [], tags_students)))
 ;;

<Students>

 <Student Name="April"/>
 <Student Name="Bob"/>
 <Student Name="Chad"/>
 <Student Name="Dave"/>
 <Student Name="Emily"/>

</Students> - : unit = () </lang>

Perl

Library: XML::MiniMini

<lang perl>#! /usr/bin/perl use strict; use XML::Mini::Document;

my @students = ( "April", "Bob", "Chad", "Dave", "Emily" );

my $doc = XML::Mini::Document->new(); my $root = $doc->getRoot(); my $studs = $root->createChild("Students"); foreach my $s (@students) {

   my $stud = $studs->createChild("Student");
   $stud->attribute("Name", $s);

} print $doc->toString();

exit 0;</lang>

Ruby

Library: REXML

<lang ruby>require 'rexml/document' include REXML

doc = Document.new root = doc.add_element("Students")

%w(April Bob Chad David Emily).each do |name|

 root.add_element("Student", {'Name' => name})

end

  1. output with no added whitespace

doc.write print "\n\n"

  1. to reproduce the sample output of the task

doc.write($stdout, 2, false, true)</lang>

produces

<Students><Student Name='April'/><Student Name='Bob'/><Student Name='Chad'/><Student Name='David'/><Student Name='Emily'/></Students>

<Students>
  <Student Name='April' />
  <Student Name='Bob' />
  <Student Name='Chad' />
  <Student Name='David' />
  <Student Name='Emily' />
</Students>

Tcl

Using only Tcl string manipulation: <lang Tcl> proc < {name attl args} {

   set res <$name
   foreach {att val} $attl {
       append res " $att='[string map {' '} $val]'"
   }
   if {[llength $args]} {
       append res >
       foreach a $args {
           append res \n$a
       } 
       append res </$name>
   } else {append res />}
   return $res

} set cmd {< Students {}} foreach XXX {April Bob Chad Dave Emily O'Connor} {

   append cmd " \[< Student {Name $XXX}\]"

} puts [eval $cmd]</lang>

produces

<Students>
<Student Name='April'/>
<Student Name='Bob'/>
<Student Name='Chad'/>
<Student Name='Dave'/>
<Student Name='Emily'/>
<Student Name='O'Connor'/></Students>

Using

Library: tDOM

<lang tcl>package require tdom set xml [dom createDocument Students] foreach name {April Bob Chad Dave Emily} {

   set element [$xml createElement Student]
   $element setAttribute Name $name
   [$xml documentElement] appendChild $element

} $xml asXML</lang>

<Students>
    <Student Name="April"/>
    <Student Name="Bob"/>
    <Student Name="Chad"/>
    <Student Name="Dave"/>
    <Student Name="Emily"/>
</Students>

Using

Library: TclXML

<lang tcl>package require dom set xml [dom::DOMImplementation create] set root [dom::document createElement $xml Students] foreach name {April Bob Chad Dave Emily} {

   set element [dom::document createElement $root Student]
   dom::element setAttribute $element Name $name

} dom::DOMImplementation serialize $xml</lang>

<?xml version='1.0'?>
<!DOCTYPE Students>
<Students><Student Name="April"/><Student Name="Bob"/><Student Name="Chad"/><Student Name="Dave"/><Student Name="Emily"/></Students>

Visual Basic .NET

<lang vbnet>Dim names As String() = New String() {"April", "Bob", "Chad", "Dave", "Emily"}

Dim xml = <Students>

             <%= From s In names Select <Student Name=<%= s %>/> %>
         </Students>

Console.WriteLine(xml)</lang>