XML/Output

< XML
Revision as of 13:23, 17 May 2009 by rosettacode>ShinTakezou (C (using libxml2))

Given the list of names and the below template, generate an XML document.

Task
XML/Output
You are encouraged to solve this task according to the task description, using any language you may know.
<Students>
  <Student Name="XXX" />
</Students>

Sample Output

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

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

<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>

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>