XML/Input: Difference between revisions
m (→{{header|Tcl}}: typo) |
(→{{header|C}}: + AWK) |
||
Line 45:
</lang>
=={{header|AWK}}==
AWK has no XML support. However, careful analysis of the task shows that it just asks for the strings in double quotes. So, here goes - split on quotes, and keep every other content:
<lang awk>
$ awk '{for(i=2;i<=NF;i+=2)r=r" "$i}END{print r}' FS='"' t.xml
April Bob Chad Dave Emily
</lang>
=={{header|C}}==
|
Revision as of 10:13, 27 May 2009
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.
<lang xml><Students>
<Student Name="April" /> <Student Name="Bob" /> <Student Name="Chad" /> <Student Name="Dave" /> <Student Name="Emily" />
</Students></lang>
Expected Output
April Bob Chad Dave Emily
ActionScript
<lang 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); } } }
} </lang>
AWK
AWK has no XML support. However, careful analysis of the task shows that it just asks for the strings in double quotes. So, here goes - split on quotes, and keep every other content: <lang awk> $ awk '{for(i=2;i<=NF;i+=2)r=r" "$i}END{print r}' FS='"' t.xml
April Bob Chad Dave Emily
</lang>
C
<lang c>#include <stdio.h>
- include <stdlib.h>
- include <string.h>
- include <libxml/parser.h>
- include <libxml/tree.h>
static void print_names(xmlNode *node) {
xmlNode *cur_node = NULL; for (cur_node = node; cur_node; cur_node = cur_node->next) { if (cur_node->type == XML_ELEMENT_NODE) { if ( strcmp(cur_node->name, "Student") == 0 ) {
xmlAttr *prop = NULL; if ( (prop = xmlHasProp(cur_node, "Name")) != NULL ) { printf("%s\n", prop->children->content);
}
} } print_names(cur_node->children); }
}
const char *buffer =
"<Students>\n" "<Student Name=\"April\" />\n" "<Student Name=\"Bob\" />\n" "<Student Name=\"Chad\" />\n" "<Student Name=\"Dave\" />\n" "<Student Name=\"Emily\" />\n" "</Students>\n";
int main() {
xmlDoc *doc = NULL; xmlNode *root = NULL;
doc = xmlReadMemory(buffer, strlen(buffer), NULL, NULL, 0); if ( doc != NULL ) { root = xmlDocGetRootElement(doc); print_names(root); xmlFreeDoc(doc); } xmlCleanupParser(); return 0;
}</lang>
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:
<lang j> load'xml/sax'
saxclass 'Students' startElement =: ([: smoutput 'Name' getAttribute~ [)^:('Student'-:]) cocurrent'base' process_Students_ XML</lang> April Bob Chad Dave Emily
and the definition of XML: <lang j> XML =: noun define
<Students> <Student Name="April" /> <Student Name="Bob" /> <Student Name="Chad" /> <Student Name="Dave" /> <Student Name="Emily" /> </Students> )</lang>
OCaml
<lang 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 = () </lang>
Python
<lang python>import xml.dom.minidom
doc = """<Students>
<Student Name="April" /> <Student Name="Bob" /> <Student Name="Chad" /> <Student Name="Dave" /> <Student Name="Emily" />
</Students>"""
doc = xml.dom.minidom.parseString(doc)
for i in doc.getElementsByTagName("Student"):
print i.getAttribute("Name")</lang>
Tcl
<lang tcl>set xml {<Students>
<Student Name="April" /> <Student Name="Bob" /> <Student Name="Chad" /> <Student Name="Dave" /> <Student Name="Emily" />
</Students>}
package require tdom set tree [dom parse $xml] set studentNodes [[$tree documentElement] childNodes]
- or
set studentNodes [$tree getElementsByTagName Student]
foreach node $studentNodes {
puts [$node getAttribute Name]
} </lang>
<lang tcl>package require xml set parser [xml::parser -elementstartcommand elem] proc elem {name attlist args} {
if {$name eq "Student"} { puts [dict get [dict create {*}$attlist] Name] }
} $parser parse $xml</lang>
Visual Basic .NET
<lang vbnet>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 </lang>