XML/DOM serialization: Difference between revisions
(added Haskell) |
m (Fixed lang tags.) |
||
Line 10: | Line 10: | ||
</root> |
</root> |
||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |
||
<lang AutoHotkey> |
<lang AutoHotkey>version = "1.0" |
||
version = "1.0" |
|||
xmlheader := "<?xml version=" . version . "?>" . "<" . root . ">" |
xmlheader := "<?xml version=" . version . "?>" . "<" . root . ">" |
||
Line 46: | Line 45: | ||
} |
} |
||
Return xml .= "</" . root%root0% . ">" |
Return xml .= "</" . root%root0% . ">" |
||
⚫ | |||
} |
|||
⚫ | |||
=={{header|C sharp|C#}}== |
=={{header|C sharp|C#}}== |
||
Serialization using the built-in XML.Serilazation library of .Net. |
Serialization using the built-in XML.Serilazation library of .Net. |
||
<lang csharp> |
<lang csharp>using System.Xml; |
||
using System.Xml; |
|||
using System.Xml.Serialization; |
using System.Xml.Serialization; |
||
[XmlRoot("root")] |
[XmlRoot("root")] |
||
Line 67: | Line 64: | ||
} |
} |
||
//Output: <?xml version="1.0" encoding="utf-8"?><root><element>Some text here</element></root> |
//Output: <?xml version="1.0" encoding="utf-8"?><root><element>Some text here</element></root> |
||
⚫ | |||
} |
|||
⚫ | |||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |
||
Line 114: | Line 110: | ||
=={{header|D}}== |
=={{header|D}}== |
||
{{works with|D|2.011+}} |
{{works with|D|2.011+}} |
||
<lang d> |
<lang d>module xmltest ; |
||
module xmltest ; |
|||
import std.stdio ; |
import std.stdio ; |
||
Line 126: | Line 121: | ||
writefln(doc) ; |
writefln(doc) ; |
||
// output: <?xml version="1.0"?><root><element>Some text here</element></root> |
// output: <?xml version="1.0"?><root><element>Some text here</element></root> |
||
⚫ | |||
} |
|||
⚫ | |||
=={{header|E}}== |
=={{header|E}}== |
||
Line 133: | Line 127: | ||
This makes use of XML libraries provided with Java. |
This makes use of XML libraries provided with Java. |
||
<lang e>def document := <unsafe:javax.xml.parsers.makeDocumentBuilderFactory> \ |
|||
.newInstance() \ |
|||
.newDocumentBuilder() \ |
|||
.getDOMImplementation() \ |
|||
.createDocument(null, "root", null) |
|||
def root := document.getDocumentElement() |
|||
root.appendChild( |
|||
def element := document.createElement("element")) |
|||
element.appendChild( |
|||
document.createTextNode("Some text here")) |
|||
println(document.saveXML(root))</lang> |
|||
(On the use of <tt><unsafe></tt>: The class has not yet been reviewed for E safety, so <tt><import:...makeDocumentBuilderFactory></tt> is not yet allowed. The review would probably be straightforward.) |
(On the use of <tt><unsafe></tt>: The class has not yet been reviewed for E safety, so <tt><import:...makeDocumentBuilderFactory></tt> is not yet allowed. The review would probably be straightforward.) |
||
Line 149: | Line 143: | ||
=={{header|Forth}}== |
=={{header|Forth}}== |
||
{{libheader|Forth Foundation Library}} |
{{libheader|Forth Foundation Library}} |
||
<lang forth>include ffl/dom.fs |
|||
\ Create a dom variable 'doc' in the dictionary |
|||
dom-create doc |
|||
\ Add the document root with its version attribute |
|||
dom.document doc dom-append-node |
|||
s" version" s" 1.0" dom.attribute doc dom-append-node |
|||
\ Add root and element |
|||
doc dom-parent 2drop |
|||
s" root" dom.element doc dom-append-node |
|||
s" element" dom.element doc dom-append-node |
|||
\ Add the text |
|||
s" Some text here" dom.text doc dom-append-node |
|||
\ Convert the document to a string and print |
|||
doc dom-write-string [IF] |
|||
type cr |
|||
[THEN]</lang> |
|||
=={{header|Groovy}}== |
=={{header|Groovy}}== |
||
<lang groovy>import groovy.xml.MarkupBuilder |
|||
def writer = new StringWriter() << '<?xml version="1.0" ?>\n' |
|||
def xml = new MarkupBuilder(writer) |
|||
xml.root() { |
|||
element('Some text here' ) |
|||
} |
|||
println writer</lang> |
|||
=={{header|Haskell}}== |
=={{header|Haskell}}== |
||
Line 217: | Line 211: | ||
DOM |
DOM |
||
⚫ | |||
<lang javascript> |
|||
⚫ | |||
var root = doc.documentElement; |
var root = doc.documentElement; |
||
var element = doc.createElement( 'element' ); |
var element = doc.createElement( 'element' ); |
||
root.appendChild( element ); |
root.appendChild( element ); |
||
element.appendChild( document.createTextNode('Some text here') ); |
element.appendChild( document.createTextNode('Some text here') ); |
||
var xmlString = new XMLSerializer().serializeToString( doc ); |
var xmlString = new XMLSerializer().serializeToString( doc );</lang> |
||
</lang> |
|||
E4X |
E4X |
||
<lang javascript> |
<lang javascript>var xml = <root> |
||
var xml = <root> |
|||
<element>Some text here</element> |
<element>Some text here</element> |
||
</root>; |
</root>; |
||
var xmlString = xml.toXMLString(); |
var xmlString = xml.toXMLString();</lang> |
||
</lang> |
|||
E4X — with processing instruction |
E4X — with processing instruction |
||
<lang javascript> |
<lang javascript>XML.ignoreProcessingInstructions = false; |
||
XML.ignoreProcessingInstructions = false; |
|||
var xml = <?xml version="1.0"?> |
var xml = <?xml version="1.0"?> |
||
<root> |
<root> |
||
<element>Some text here</element> |
<element>Some text here</element> |
||
</root>; |
</root>; |
||
var xmlString = xml.toXMLString(); |
var xmlString = xml.toXMLString();</lang> |
||
</lang> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
{{libheader|XML::Simple}} |
{{libheader|XML::Simple}} |
||
<lang perl> |
<lang perl>use XML::Simple; |
||
⚫ | |||
use XML::Simple; |
|||
⚫ | |||
</lang> |
|||
'''Output''': |
'''Output''': |
||
Line 260: | Line 246: | ||
{{libheader|XML::DOM::BagOfTricks}} |
{{libheader|XML::DOM::BagOfTricks}} |
||
⚫ | |||
<lang perl> |
|||
⚫ | |||
my ($doc, $root) = createDocument('root'); |
my ($doc, $root) = createDocument('root'); |
||
Line 267: | Line 252: | ||
createTextElement($doc, 'element', 'Some text here') |
createTextElement($doc, 'element', 'Some text here') |
||
); |
); |
||
print $doc->toString; |
print $doc->toString;</lang> |
||
</lang> |
|||
'''Output''': |
'''Output''': |
||
Line 274: | Line 258: | ||
{{libheader|LibXML}} |
{{libheader|LibXML}} |
||
<lang perl> |
<lang perl>use XML::LibXML; |
||
use XML::LibXML; |
|||
$xml = XML::LibXML::Document->new('1.0'); |
$xml = XML::LibXML::Document->new('1.0'); |
||
Line 286: | Line 269: | ||
$node->addChild($node2); |
$node->addChild($node2); |
||
print $xml->toString; |
print $xml->toString;</lang> |
||
</lang> |
|||
'''Output''': |
'''Output''': |
||
Line 295: | Line 277: | ||
=={{header|PHP}}== |
=={{header|PHP}}== |
||
{{works with|PHP|5}} |
{{works with|PHP|5}} |
||
<lang php> |
<lang php><?php |
||
<?php |
|||
$dom = new DOMDocument();//the constructor also takes the version and char-encoding as it's two respective parameters |
$dom = new DOMDocument();//the constructor also takes the version and char-encoding as it's two respective parameters |
||
$dom->formatOutput = true;//format the outputted xml |
$dom->formatOutput = true;//format the outputted xml |
||
Line 304: | Line 285: | ||
$root->appendChild($element); |
$root->appendChild($element); |
||
$dom->appendChild($root); |
$dom->appendChild($root); |
||
$xmlstring = $dom->saveXML(); |
$xmlstring = $dom->saveXML();</lang> |
||
</lang> |
|||
=={{header|Python}}== |
=={{header|Python}}== |
||
{{works with|Python|2.5}} |
{{works with|Python|2.5}} |
||
<lang python> |
<lang python>from xml.dom.minidom import getDOMImplementation |
||
from xml.dom.minidom import getDOMImplementation |
|||
dom = getDOMImplementation() |
dom = getDOMImplementation() |
||
Line 321: | Line 300: | ||
firstElement.appendChild(textNode) |
firstElement.appendChild(textNode) |
||
xmlString = document.toprettyxml(" " * 4) |
xmlString = document.toprettyxml(" " * 4)</lang> |
||
</lang> |
|||
<lang python> |
<lang python>from xml.etree import ElementTree as et |
||
from xml.etree import ElementTree as et |
|||
root = et.Element("root") |
root = et.Element("root") |
||
et.SubElement(root, "element").text = "Some text here" |
et.SubElement(root, "element").text = "Some text here" |
||
xmlString = et.tostring(root) |
xmlString = et.tostring(root)</lang> |
||
</lang> |
|||
=={{header|Ruby}}== |
=={{header|Ruby}}== |
||
Line 383: | Line 359: | ||
=={{header|XQuery}}== |
=={{header|XQuery}}== |
||
In XQuery static element construction is like normal XML: |
In XQuery static element construction is like normal XML: |
||
<lang xquery> |
<lang xquery><root> |
||
<root> |
|||
<element> |
<element> |
||
Some text here |
Some text here |
||
</element> |
</element> |
||
</root> |
</root></lang> |
||
</lang> |
|||
Dynamic element construction looks quite different: |
Dynamic element construction looks quite different: |
||
<lang xquery> |
<lang xquery>let $rootTagname := 'root' |
||
let $rootTagname := 'root' |
|||
let $elementTagname := 'element' |
let $elementTagname := 'element' |
||
let $elementContent := 'Some text here' |
let $elementContent := 'Some text here' |
||
Line 402: | Line 375: | ||
element{$elementTagname} |
element{$elementTagname} |
||
{$elementContent} |
{$elementContent} |
||
} |
}</lang> |
||
</lang> |
|||
=={{header|XSLT}}== |
=={{header|XSLT}}== |
||
⚫ | |||
<lang> |
|||
⚫ | |||
<xsl:output method="xml" indent="yes" /> |
<xsl:output method="xml" indent="yes" /> |
||
<xsl:template match="/"> <!-- replace the root of the incoming document with our own model --> |
<xsl:template match="/"> <!-- replace the root of the incoming document with our own model --> |
||
Line 416: | Line 387: | ||
</xsl:element> |
</xsl:element> |
||
</xsl:template> |
</xsl:template> |
||
</xsl:stylesheet> |
</xsl:stylesheet></lang> |
||
</lang> |
|||
{{omit from|M4}} |
{{omit from|M4}} |
Revision as of 21:27, 19 November 2009
You are encouraged to solve this task according to the task description, using any language you may know.
Create a simple DOM and having it serialize to:
<?xml version="1.0" ?> <root> <element> Some text here </element> </root>
AutoHotkey
<lang AutoHotkey>version = "1.0" xmlheader := "<?xml version=" . version . "?>" . "<" . root . ">"
element("root", "child") element("root", "element", "more text here") element("root_child", "kid", "yak yak") MsgBox % xmlheader . serialize("root") Return
element(parent, name, text="") {
Global %parent%_children .= name . "`n" %parent%_%name% = %parent%_%name% %parent%_%name%_name := name %parent%_%name%_text := text
}
serialize(root){
StringSplit, root, root, _ xml .= "<" . root%root0% . ">" StringTrimRight, %root%_children, %root%_children, 1 Loop, Parse, %root%_children, `n { If %root%_%A_LoopField%_children xml .= serialize(%root%_%A_LoopField%) Else { element := "<" . %root%_%A_LoopField%_name . ">" element .= %root%_%A_LoopField%_text element .= "</" . %root%_%A_LoopField%_name . ">" xml .= element } } Return xml .= "</" . root%root0% . ">"
}</lang>
C#
Serialization using the built-in XML.Serilazation library of .Net. <lang csharp>using System.Xml; using System.Xml.Serialization; [XmlRoot("root")] public class ExampleXML {
[XmlElement("element")] public string element = "Some text here"; static void Main(string[] args) { var xmlnamespace = new XmlSerializerNamespaces(); xmlnamespace.Add("", ""); //used to stop default namespaces from printing var writer = XmlWriter.Create("output.xml"); new XmlSerializer(typeof(ExampleXML)).Serialize(writer, new ExampleXML(), xmlnamespace); } //Output: <?xml version="1.0" encoding="utf-8"?><root><element>Some text here</element></root>
}</lang>
Common Lisp
Assuming that matching the whitespace in the problem description isn't necessary and that character encodings are permitted (see the talk page):
<lang lisp>(let* ((doc (dom:create-document 'rune-dom:implementation nil nil nil))
(root (dom:create-element doc "root")) (element (dom:create-element doc "element")) (text (dom:create-text-node doc "Some text here"))) (dom:append-child element text) (dom:append-child root element) (dom:append-child doc root) (dom:map-document (cxml:make-rod-sink) doc))</lang>
gives the following output:
<?xml version="1.0" encoding="UTF-8"?> <root><element>Some text here</element></root>
Because dom:append-child
returns the appended child, the same output can be produced while binding fewer variables:
<lang lisp>(let ((doc (dom:create-document 'rune-dom:implementation nil nil nil)))
(dom:append-child (dom:append-child (dom:append-child doc (dom:create-element doc "root")) (dom:create-element doc "element")) (dom:create-text-node doc "Some text here")) (write-string (dom:map-document (cxml:make-rod-sink) doc)))</lang>
The prefix notation makes this hard to decipher, however, and so a final version uses an auxiliary append-child*
:
<lang lisp>(defun append-child* (parent &rest children)
(reduce 'dom:append-child children :initial-value parent))
(let* ((doc (dom:create-document 'rune-dom:implementation nil nil nil)))
(append-child* doc (dom:create-element doc "root") (dom:create-element doc "element") (dom:create-text-node doc "Some text here")) (write-string (dom:map-document (cxml:make-rod-sink) doc)))</lang>
D
<lang d>module xmltest ;
import std.stdio ; import std.xml ;
void main() {
auto doc = new Document("root") ;
//doc.prolog = q"/<?xml version="1.0"?>/" ; // default
doc ~= new Element("element", "Some text here") ; writefln(doc) ;
// output: <?xml version="1.0"?><root><element>Some text here</element></root> }</lang>
E
This makes use of XML libraries provided with Java.
<lang e>def document := <unsafe:javax.xml.parsers.makeDocumentBuilderFactory> \
.newInstance() \ .newDocumentBuilder() \ .getDOMImplementation() \ .createDocument(null, "root", null)
def root := document.getDocumentElement() root.appendChild(
def element := document.createElement("element"))
element.appendChild(
document.createTextNode("Some text here"))
println(document.saveXML(root))</lang>
(On the use of <unsafe>: The class has not yet been reviewed for E safety, so <import:...makeDocumentBuilderFactory> is not yet allowed. The review would probably be straightforward.)
Forth
<lang forth>include ffl/dom.fs
\ Create a dom variable 'doc' in the dictionary
dom-create doc
\ Add the document root with its version attribute
dom.document doc dom-append-node
s" version" s" 1.0" dom.attribute doc dom-append-node
\ Add root and element
doc dom-parent 2drop
s" root" dom.element doc dom-append-node
s" element" dom.element doc dom-append-node
\ Add the text
s" Some text here" dom.text doc dom-append-node
\ Convert the document to a string and print
doc dom-write-string [IF]
type cr
[THEN]</lang>
Groovy
<lang groovy>import groovy.xml.MarkupBuilder def writer = new StringWriter() << '<?xml version="1.0" ?>\n' def xml = new MarkupBuilder(writer) xml.root() {
element('Some text here' )
} println writer</lang>
Haskell
Using the XML.Light module from HackageDB
<lang Haskell>import Data.List import Text.XML.Light
xmlDOM :: String -> String xmlDOM txt = showTopElement $ Element
(unqual "root") [] [ Elem $ Element (unqual "element") [] [Text $ CData CDataText txt Nothing] Nothing ] Nothing</lang>
Output:
*Main> mapM_ (putStrLn.ppContent) $ parseXML (xmlDOM " Some text ") <?xml version="1.0" ?> <root> <element> Some text </element> </root>
JavaScript
DOM
<lang javascript>var doc = document.implementation.createDocument( null, 'root', null ); var root = doc.documentElement; var element = doc.createElement( 'element' ); root.appendChild( element ); element.appendChild( document.createTextNode('Some text here') ); var xmlString = new XMLSerializer().serializeToString( doc );</lang>
E4X
<lang javascript>var xml = <root>
<element>Some text here</element>
</root>; var xmlString = xml.toXMLString();</lang>
E4X — with processing instruction
<lang javascript>XML.ignoreProcessingInstructions = false; var xml = <?xml version="1.0"?> <root>
<element>Some text here</element>
</root>; var xmlString = xml.toXMLString();</lang>
Perl
<lang perl>use XML::Simple; print XMLout( { root => { element => "Some text here" } }, NoAttr => 1, RootName => "" );</lang>
Output:
<root> <element>Some text here</element> </root>
<lang perl>use XML::DOM::BagOfTricks qw(createDocument createTextElement);
my ($doc, $root) = createDocument('root'); $root->appendChild(
createTextElement($doc, 'element', 'Some text here')
); print $doc->toString;</lang>
Output:
<root><element>Some text here</element></root>
<lang perl>use XML::LibXML;
$xml = XML::LibXML::Document->new('1.0'); $node = $xml->createElement('root'); $xml->setDocumentElement($node); $node2 = $xml->createElement('element'); $text = $xml->createTextNode('Some text here'); $node2->addChild($text); $node->appendWellBalancedChunk('text'); $node->addChild($node2);
print $xml->toString;</lang>
Output:
<?xml version="1.0"?> <root>text<element>Some text here</element></root>
PHP
<lang php><?php $dom = new DOMDocument();//the constructor also takes the version and char-encoding as it's two respective parameters $dom->formatOutput = true;//format the outputted xml $root = $dom->createElement('root'); $element = $dom->createElement('element'); $element->appendChild($dom->createTextNode('Some text here')); $root->appendChild($element); $dom->appendChild($root); $xmlstring = $dom->saveXML();</lang>
Python
<lang python>from xml.dom.minidom import getDOMImplementation
dom = getDOMImplementation() document = dom.createDocument(None, "root", None)
topElement = document.documentElement firstElement = document.createElement("element") topElement.appendChild(firstElement) textNode = document.createTextNode("Some text here") firstElement.appendChild(textNode)
xmlString = document.toprettyxml(" " * 4)</lang>
<lang python>from xml.etree import ElementTree as et
root = et.Element("root") et.SubElement(root, "element").text = "Some text here" xmlString = et.tostring(root)</lang>
Ruby
<lang ruby>require("rexml/document") include REXML (doc = Document.new) << XMLDecl.new root = doc.add_element('root') element = root.add_element('element') element.add_text('Some text here')
- save to a string
- (the first argument to write() needs an object that understands "<<")
serialized = String.new doc.write(serialized, 4) puts serialized</lang>
produces
<?xml version='1.0'?> <root> <element> Some text here </element> </root>
Tcl
<lang tcl>package require tdom set d [dom createDocument root] set root [$d documentElement] $root appendChild [$d createElement element] [$root firstChild] appendChild [$d createTextNode "Some text here"] $d asXML</lang>
<root> <element>Some text here</element> </root>
Using TclDOM <lang tcl>package require dom set doc [dom::DOMImplementation create] set root [dom::document createElement $doc root] set elem [dom::document createElement $root element] set text [dom::document createTextNode $elem "Some text here"] dom::DOMImplementation serialize $doc -newline {element}</lang>
<?xml version='1.0'?> <!DOCTYPE root> <root> <element> Some text here </element> </root>
XQuery
In XQuery static element construction is like normal XML: <lang xquery><root>
<element> Some text here </element>
</root></lang>
Dynamic element construction looks quite different: <lang xquery>let $rootTagname := 'root' let $elementTagname := 'element' let $elementContent := 'Some text here'
return
element {$rootTagname} { element{$elementTagname} {$elementContent} }</lang>
XSLT
<lang xml><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" /> <xsl:template match="/"> <xsl:element name="root"> <xsl:element name="element"> <xsl:text>Some text here</xsl:text> </xsl:element> </xsl:element> </xsl:template>
</xsl:stylesheet></lang>