XML/Input: Difference between revisions

From Rosetta Code
< XML
Content added Content deleted
m (Alphabetizing, highlighting)
(→‎{{header|J}}: noted that XPath is implicitly discouraged as a soln, for some reason, so use SAX instead.)
Line 46: Line 46:


=={{header|J}}==
=={{header|J}}==
J's system includes XML processing libraries -- this task is best addressed with the XSLT library:
J's system includes several XML processing libraries. This task is probably best addressed using XPath (this is the type of problem XPath was designed to solve), but the task description implicitly discourages that method. So we can use the SAX library instead:


load 'xml/xslt'
load'xml/sax'
saxclass 'Students'
XSL xslt XML
startElement =: ([: smoutput 'Name' getAttribute~ [)^:('Student'-:])
cocurrent'base'
process_Students_ XML
April
April
Bob
Bob
Line 57: Line 61:
Emily
Emily


with the appropriate definitions of <tt>XSL</tt> and <tt>XML</tt>:
and the definition of <tt>XML</tt>:
XML =: noun define
XML =: noun define
<Students>
<Students>
Line 67: Line 70:
<Student Name="Emily" />
<Student Name="Emily" />
</Students>
</Students>
)
XSL =: noun define
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:h="http://www.w3.org/1999/xhtml">
<xsl:output method="text" encoding="UTF-8" media-type="text/plain" />
<xsl:template match="/">
<xsl:apply-templates select="/Students/Student" />
</xsl:template>
<xsl:template match="/Students/Student">
<xsl:value-of select="@Name" />
<!-- Platform-independent line breaks (instead of &#10; or something) -->
<xsl:text><![CDATA[
]]></xsl:text>
</xsl:template>
</xsl:stylesheet>
)
)



Revision as of 21:56, 23 January 2009

Task
XML/Input
You are encouraged to solve this task according to the task description, using any language you may know.

Given the below XML fragment, extract the list of names using whatever means desired. If the only viable method is to use XPath, refer the reader to the task XML_and_XPath.

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

Expected Output

April
Bob
Chad
Dave
Emily

ActionScript

<actionscript> package {

   import flash.display.Sprite;
   public class XMLReading extends Sprite
   {
       public function XMLReading()
       {
           var xml:XML = <Students>
                           <Student Name="April" />
                           <Student Name="Bob" />
                           <Student Name="Chad" />
                           <Student Name="Dave" />
                           <Student Name="Emily" />
                         </Students>;
           for each(var node:XML in xml..Student)
           {
               trace(node.@Name);
           }
       }
   }

} </actionscript>

J

J's system includes several XML processing libraries. This task is probably best addressed using XPath (this is the type of problem XPath was designed to solve), but the task description implicitly discourages that method. So we can use the SAX library instead:

load'xml/sax'

saxclass 'Students'
startElement =: ([: smoutput 'Name' getAttribute~ [)^:('Student'-:])
cocurrent'base'

process_Students_ XML
April
Bob
Chad
Dave
Emily

and the definition of XML:

XML =: noun define
<Students>
  <Student Name="April" />
  <Student Name="Bob" />
  <Student Name="Chad" />
  <Student Name="Dave" />
  <Student Name="Emily" />
</Students>
)

OCaml

# #directory "+site-lib/xml-light" (* or maybe just "+xml-light" *) ;;
# #load "xml-light.cma" ;;

# let x = Xml.parse_string "
  <Students>
    <Student Name=\"April\" />
    <Student Name=\"Bob\" />
    <Student Name=\"Chad\" />
    <Student Name=\"Dave\" />
    <Student Name=\"Emily\" />
  </Students>"
  in
  Xml.iter (function
    (Xml.Element ("Student", [("Name", name)], [])) -> print_endline name
  |  _ -> ()) x
  ;;
April
Bob
Chad
Dave
Emily
- : unit = ()

Visual Basic .NET

Dim xml = <Students>

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

Dim names = (From node In xml...<Student> Select node.@Name).ToArray

For Each name In names

    Console.WriteLine(name)

Next