XML/DOM serialization: Difference between revisions

From Rosetta Code
< XML
Content added Content deleted
(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% . ">"
}</lang>
}
</lang>


=={{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>
}</lang>
}
</lang>


=={{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>
}</lang>
}
</lang>


=={{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.


def document := <unsafe:javax.xml.parsers.makeDocumentBuilderFactory> \
<lang e>def document := <unsafe:javax.xml.parsers.makeDocumentBuilderFactory> \
.newInstance() \
.newInstance() \
.newDocumentBuilder() \
.newDocumentBuilder() \
.getDOMImplementation() \
.getDOMImplementation() \
.createDocument(null, "root", null)
.createDocument(null, "root", null)
def root := document.getDocumentElement()
def root := document.getDocumentElement()
root.appendChild(
root.appendChild(
def element := document.createElement("element"))
def element := document.createElement("element"))
element.appendChild(
element.appendChild(
document.createTextNode("Some text here"))
document.createTextNode("Some text here"))
println(document.saveXML(root))
println(document.saveXML(root))</lang>


(On the use of <tt>&lt;unsafe></tt>: The class has not yet been reviewed for E safety, so <tt>&lt;import:...makeDocumentBuilderFactory></tt> is not yet allowed. The review would probably be straightforward.)
(On the use of <tt>&lt;unsafe></tt>: The class has not yet been reviewed for E safety, so <tt>&lt;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}}
include ffl/dom.fs
<lang forth>include ffl/dom.fs

\ Create a dom variable 'doc' in the dictionary
\ Create a dom variable 'doc' in the dictionary

dom-create doc
dom-create doc

\ Add the document root with its version attribute
\ Add the document root with its version attribute

dom.document doc dom-append-node
dom.document doc dom-append-node

s" version" s" 1.0" dom.attribute doc dom-append-node
s" version" s" 1.0" dom.attribute doc dom-append-node

\ Add root and element
\ Add root and element

doc dom-parent 2drop
doc dom-parent 2drop

s" root" dom.element doc dom-append-node
s" root" dom.element doc dom-append-node

s" element" dom.element doc dom-append-node
s" element" dom.element doc dom-append-node

\ Add the text
\ Add the text

s" Some text here" dom.text doc dom-append-node
s" Some text here" dom.text doc dom-append-node

\ Convert the document to a string and print
\ Convert the document to a string and print

doc dom-write-string [IF]
doc dom-write-string [IF]
type cr
type cr
[THEN]
[THEN]</lang>


=={{header|Groovy}}==
=={{header|Groovy}}==
import groovy.xml.MarkupBuilder
<lang groovy>import groovy.xml.MarkupBuilder
def writer = new StringWriter() << '<?xml version="1.0" ?>\n'
def writer = new StringWriter() << '<?xml version="1.0" ?>\n'
def xml = new MarkupBuilder(writer)
def xml = new MarkupBuilder(writer)
xml.root() {
xml.root() {
element('Some text here' )
element('Some text here' )
}
}
println writer
println writer</lang>


=={{header|Haskell}}==
=={{header|Haskell}}==
Line 217: Line 211:
DOM
DOM


<lang javascript>var doc = document.implementation.createDocument( null, 'root', null );
<lang javascript>
var doc = document.implementation.createDocument( null, 'root', null );
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;
print XMLout( { root => { element => "Some text here" } }, NoAttr => 1, RootName => "" );</lang>
use XML::Simple;
print XMLout( { root => { element => "Some text here" } }, NoAttr => 1, RootName => "" );
</lang>


'''Output''':
'''Output''':
Line 260: Line 246:


{{libheader|XML::DOM::BagOfTricks}}
{{libheader|XML::DOM::BagOfTricks}}
<lang perl>use XML::DOM::BagOfTricks qw(createDocument createTextElement);
<lang perl>
use XML::DOM::BagOfTricks qw(createDocument createTextElement);


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 xml><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<lang>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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

Task
XML/DOM serialization
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

Library: Closure XML

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

Works with: D version 2.011+

<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

Works with: E-on-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 <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

Works with: Firefox version 2.0

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>
Library: LibXML

<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

Works with: PHP version 5

<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

Works with: Python version 2.5

<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

Library: REXML

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

  1. save to a string
  2. (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

Library: tDOM

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